目標
オーディオ、ドキュメント、壁など、できる限りすべてを保存します。 投稿へのすべての添付ファイルは壁からドラッグする必要があり、すべての添付ファイルを含むコメントも不要ではありません。 これは少なくとも、音楽とコメントを含むすべての投稿が保存され、友人が良いトラック
原因に!
このようなアプリケーションを作成するプロセスはハブで繰り返し 説明されているため、すべての詳細を繰り返すことはせず、手順を簡単に説明し、問題についても少し説明します。 記事がソースコードでオーバーロードされるのを防ぐため、最後にgithubへのリンクがあります。
開発に関する考慮事項
- まず、 アプリケーションIDを取得する必要があります 。 タイプがスタンドアロンであることが重要です。そうでないと、一部のvk apiメソッドが使用できなくなります。
- データを保存するユーザーのIDがまだ必要です。 あなたは設定ページであなたを見つけることができます
- アプリケーションを機能させるには、ユーザーの許可、またはアクセストークンが必要です。 トークンを取得するための直接的な非インタラクティブな方法はありません。認証ページを解析できますが、ブラウザのボタンをクリックしてURLをコピーするようユーザーに依頼する方が簡単です。 auth()関数がこれを担当します。
url = "https://oauth.vk.com/oauth/authorize?" + \ "redirect_uri=https://oauth.vk.com/blank.html&response_type=token&" + \ "client_id=%s&scope=%s&display=wap" % (args.app_id, ",".join(args.access_rights)) print("Please open this url:\n\n\t{}\n".format(url)) raw_url = raw_input("Grant access to your acc and copy resulting URL here: ") res = re.search('access_token=([0-9A-Fa-f]+)', raw_url, re.I)
- Vk apiリクエストには、1秒あたり5つまでの制限があります。 サーバーに頻繁にアクセスすると、エラーで応答します。 これは十分に便利です。エラーコードにより、スクリプトの動作が速すぎることを理解でき、しばらく待ってからリクエストを繰り返します。
if result[u'error'][u'error_code'] == 6: # too many requests logging.debug("Too many requests per second, sleeping..") sleep(1) continue
- 定期的に、vkサーバーでは、クライアントがボットであると疑って、キャプチャを解決する必要があります。 一般的に、彼は正しく疑っています。 保存プロセスが中断しないように、ユーザーは画像へのリンクをたどってキャプチャを解き、答えを出すようにユーザーに依頼する必要があります。 これは、単純な名前captcha()を持つ関数にレンダリングされます。
print("They want you to solve CAPTCHA. Please open this URL, and type here a captcha solution:") print("\n\t{}\n".format(data[u'error'][u'captcha_img'])) solution = raw_input("Solution = ").strip() return data[u'error'][u'captcha_sid'], solution
- リンク、いいねの数などの追加情報、JSONのサーバー応答は、念のためファイルに書き込まれます。
- 一部のオーディオ録音には歌詞が付いていますが、これも保存するのが理にかなっています。
- ファイル名はファイルシステムに対して正しくない可能性があるため、いくつかの文字を削除する必要があります。 既製の「正しい」ソリューションが見つからなかったため、ミニバイクを発明しなければなりませんでした。
result = unicode(re.sub('[^+=\-()$!#%&,.\w\s]', '_', name, flags=re.UNICODE).strip())
- ファイル名に関する別の問題:たとえばドキュメントの場合、それらは一致する場合があります。 これを行うには、ファイル名に(n)を追加します。nは、一意のファイル名を示す最初の番号です。
#file might exist, so add (1) or (2) etc counter = 1 if exists(fname) and isfile(fname): name, ext = splitext(fname) fname = name + " ({})".format(counter) + ext while exists(fname) and isfile(fname): counter += 1 name, ext = splitext(fname) fname = name[:-4] + " ({})".format(counter) + ext
続ける
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アプリケーションで「ふり」をすることができます。 彼らにとっては、方法は異なるかもしれませんが、オーディオ録音を操作する機能は消えません。