この記事では、XML-RPCを使用して、LiveJournalの投稿へのコメントに関する情報を取得する方法、さらには少し削除する方法について説明します。
当初、スクリプトはLJ Navalnyの状況に関連して作成されました。LJNavalnyでは、未知のボットが同じメッセージを数千件投稿し、コメント内の議論の展開を妨げます。 私は彼の見解を完全には共有していません(そして、私は確かに彼のファンに属していません)が、インターネットでの言論の自由が必要なので、スクリプトでコメントを処理する可能性を探求しました。
Livejournalの各エントリには、同じジャーナル内で繰り返されない一意のID(
jitemid )があります。 これは通常の自動インクリメント識別子ですが、レコードURLには直接表示されません。 代わりに、次の式で計算される
ditemidが使用されます。
ditemid = 256 * jitemid + anum
ここで
anumは0から255までの乱数で、投稿の作成時に一度指定され、それに関する情報とともに保存されます。
同じテクニックがコメントにも適用されますが、コメントには独自のanumがありますが、投稿から取得されます。 対応するコメントオプションは
jtalkidおよび
dtalkidと呼ばれます。
LJのXML-RPCプロトコルについては、
ここで説明し
ます 。
geteventsメソッドを使用して、ログ内のすべてのエントリを取得できます(最後のnエントリを取得します。このため、パラメータselecttype = lastnおよびhowmany = nを指定する必要があります)。 この方法で取得したレコードに関する情報には、itemid(= jitemid)とanumが含まれています。
Reply_countも送信されます-エントリのコメント数。 ちなみに、明示的に
userjournalを指定することで、任意のジャーナル(フレンドリストに含まれている場合は
サブロックを含む)から利用可能なレコードを取得できます。
コメントに直接進みます。 ここでは、残念なことに待ち構えています。 プロトコルの説明から判断すると、コメントを操作する方法はありません。
幸いなことに、ソースを読み取ると
、プロトコルハンドラー
コードで必要なメソッドを見つけることができ
ます (力を使って、ソースを読んでください!)。 興味深いことがたくさんあります。
my %HANDLERS = (
login => \&login,
getfriendgroups => \&getfriendgroups,
getfriends => \&getfriends,
friendof => \&friendof,
checkfriends => \&checkfriends,
getdaycounts => \&getdaycounts,
postevent => \&postevent,
editevent => \&editevent,
syncitems => \&syncitems,
getevents => \&getevents,
editfriends => \&editfriends,
editfriendgroups => \&editfriendgroups,
consolecommand => \&consolecommand,
getchallenge => \&getchallenge,
sessiongenerate => \&sessiongenerate,
sessionexpire => \&sessionexpire,
getusertags => \&getusertags,
getfriendspage => \&getfriendspage,
getinbox => \&getinbox,
sendmessage => \&sendmessage,
setmessageread => \&setmessageread,
addcomment => \&addcomment,
checksession => \&checksession,
getrecentcomments => \&getrecentcomments,
getcomments => \&getcomments,
delcomments => \&delcomments,
screencomments => \&screencomments,
unscreencomments => \&unscreencomments,
freezecomments => \&unfreezecomments,
editcomment => \&editcomment,
);
Getcommentsと
Delcommentsは、私たちの目的に
役立ちます。
getcommentsを使用して投稿のコメントを取得するには、ditemid(投稿の識別子)、journal(この投稿が投稿されるジャーナル、たとえばnavalny)、page(コメントページ番号)を指定します。 スレッドをデプロイしたくない場合は、expand_strategy = mobile_threadを指定します。 geteventsと同様に、利用可能なコメントを取得できます。 これに応じて、一連の第1レベルのコメントを受け取ります。 コメントに対する回答がある場合は、配列としてコメントに添付されます。
次に、コメントのすべてのページとページで、利用可能なすべてのコメントを確認し、確認するだけです。 ストップワードのみを使用しましたが、作成者の登録日までは何でも確認できます(それぞれに個別のリクエストが必要です)。 選択したdtalkidをdelcommentsメソッドに渡します(追加の再帰パラメーターを使用すると、スレッド全体を削除できます)。 出来上がり! きれいな雑誌があります!
PHPスクリプトのソースコードは
GitHubで表示できます。
貴重な情報を提供してくれた著者と
これに感謝します。