vk.com-オーディオ、ドキュメント、ウォールコンテンツを保存する

私は、ソーシャルネットワーク上のデータの保存が不十分であることに長い間気付いていました。 たとえば、元の投稿の作成者が削除した場合、再投稿は空になります。 vkでのオーディオレコーディングに関する最近の問題は最後のストローであり、核戦争の際に関心のあるデータをすべてローカルに保存することにしまし 。 既製のソリューションを探した後、自分に合ったものが見つからなかったため、数日でスクリプトがPythonで作成されました。



目標



オーディオ、ドキュメント、壁など、できる限りすべてを保存します。 投稿へのすべての添付ファイルは壁からドラッグする必要があり、すべての添付ファイルを含むコメントも不要ではありません。 これは少なくとも、音楽とコメントを含むすべての投稿が保存され、友人が良いトラックまたはシールを送信するために必要です。 私の目的のために、追加情報(いいね、レコード作成時間など)の読み取り可能なバックアップはなかったとすぐに言わなければなりません。



原因に!



このようなアプリケーションを作成するプロセスはハブで繰り返し 説明されているため、すべての詳細を繰り返すことはせず、手順を簡単に説明し、問題についても少し説明します。 記事がソースコードでオーバーロードされるのを防ぐため、最後にgithubへのリンクがあります。



開発に関する考慮事項






続ける


API呼び出しコードはhabrayuzer jioevの 記事から取得され、上記の状況の処理が追加されています。 (壁を処理する場合)保存するものがあるためには、最初に投稿の数を調べる必要があります:

  #determine posts count (response, json_stuff) = call_api("wall.get", [("owner_id", args.id), ("count", 1), ("offset", 0)], args) count = response[0]
      
      





次に、各投稿を個別にリクエストして解析します

  for x in xrange(args.wall_start, args.wall_end): (post, json_stuff) = call_api("wall.get", [("owner_id", args.id), ("count", 1), ("offset", x)], args) process_post(("wall post", x), post, post_parser, json_stuff)
      
      





リクエストの結果は、標準ライブラリのjson.loads()を使用してPythonの標準構造に解析されるJSONのデータのセットです。 その結果、一部のフィールド(キーと値)がペイロードを運ぶハッシュ配列があり、残りは私たちには関係ありません。 どのメソッドを使用してどのフィールドを処理するかを自分の手で記述しないために、リフレクションの力を使用します。目的のキーに一致する名前のメソッドを探します。

  for k in raw_data.keys(): try: f = getattr(self, k) keys.append(k) funcs.append(f) except AttributeError: logging.warning("Not implemented: {}".format(k)) logging.info("Saving: {} for {}".format(', '.join(keys), raw_data['id'])) for (f, k) in zip(funcs, keys): f(k, raw_data)
      
      







パルシム


次に、応答フィールドを処理する必要があります。 興味深いのは、添付ファイル、テキスト、コメントです。 添付ファイルは、投稿のアプリケーション(オーディオ、写真、ドキュメント、メモ)のリストです。各タイプをダウンロードできる必要があります。 同様の方法で各添付ファイルを処理する方法を決定します。添付ファイルの種類によって、適切な名前のメソッドを探します。 オーディオ用の「ロッキングチェア」の例を次に示します。

  def dl_audio(self, data): aid = data["aid"] owner = data["owner_id"] request = "{}_{}".format(owner, aid) (audio_data, json_stuff) = call_api("audio.getById", [("audios", request), ], self.args) try: data = audio_data[0] name = u"{artist} - {title}.mp3".format(**data) self.save_url(data["url"], name) except IndexError: # deleted :( logging.warning("Deleted track: {}".format(str(data))) return # store lyrics if any try: lid = data["lyrics_id"] except KeyError: return (lyrics_data, json_stuff) = call_api("audio.getLyrics", [("lyrics_id", lid), ], self.args) text = lyrics_data["text"].encode('utf-8') ...
      
      





残念ながら、著作権所有者の要求で押収された音声録音は使用できなくなり、空の回答が返されます。



残りはどうですか?



githubで画像、テキスト、メモを処理し、ドキュメントとその他をアップロードするためのメソッド。 私はすべてが与えられた例に似ていると言うことができるだけです。 スクリプトにはコマンドライン引数もありますが、記事で説明することは意味がありません。 例やその他の詳細はreadmeにあります。



藤堂


写真アルバムは保存しませんでした。重要なものは何も保存されておらず、 彼の記事の キロネットコードはうまく機能しています。 ビデオやメモはまだ保存されていませんが、私にはあまり必要ではないようです。



最後に


コードは理想とはほど遠いもので、松葉杖がない場合でも違いはありませんが、タスクを実行します。 誰かが私のノート/ドキュメント/音楽を保存したり、トレーニングをしたりするのに役立つと思います。



UPD 12/18/2016


ユーザーhiwentによると、 2016年 12月16日以降、vkはAPIを使用してオーディオ録音を操作する機能を終了しました。 この点で、オーディオレコーディングの保存用に提供されているスクリプトの機能は動作しません。 この点で、たとえばAndroidバージョンやケートモバイルなどのネイティブvkアプリケーションで「ふり」をすることができます。 彼らにとっては、方法は異なるかもしれませんが、オーディオ録音を操作する機能は消えません。



All Articles