XML-RPCを使用したLivejournalでのコメントの自動フィルター

この記事では、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,

);







GetcommentsDelcommentsは、私たちの目的に役立ちます。



getcommentsを使用して投稿のコメントを取得するには、ditemid(投稿の識別子)、journal(この投稿が投稿されるジャーナル、たとえばnavalny)、page(コメントページ番号)を指定します。 スレッドをデプロイしたくない場合は、expand_strategy = mobile_threadを指定します。 geteventsと同様に、利用可能なコメントを取得できます。 これに応じて、一連の第1レベルのコメントを受け取ります。 コメントに対する回答がある場合は、配列としてコメントに添付されます。



次に、コメントのすべてのページとページで、利用可能なすべてのコメントを確認し、確認するだけです。 ストップワードのみを使用しましたが、作成者の登録日までは何でも確認できます(それぞれに個別のリクエストが必要です)。 選択したdtalkidをdelcommentsメソッドに渡します(追加の再帰パラメーターを使用すると、スレッド全体を削除できます)。 出来上がり! きれいな雑誌があります!



PHPスクリプトのソースコードはGitHubで表示できます。



貴重な情報を提供してくれた著者とこれに感謝します。



All Articles