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で表示できます。

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

Source: https://habr.com/ru/post/J114385/


All Articles