はてなブックマークを投稿するためのpython
はてブの投稿用のpythonスクリプトでボットしてたらあれげなことになってしまったので取りあえずアカウント復活のためにメールで問合せしつつも、結局はAPIは使えない状態になったので結局ConsumerKeyとか全部発行しなおさないといけない。
で、どうやって発行したのか試行錯誤の過程がまるで残っていないので、非常に困った。
将来の自分が同じようなことで困ったときに備えてはてなのAPIを使うためのシークレットの発行方法とかまとめておくことにしました。
http://developer.hatena.ne.jp/
・[アプリケーション登録]をクリックする。
・[新しいアプリケーションの追加]をクリック
・[アプリケーションの名称]、[アプリケーションの説明]、[アプリケーションのURL]を入力する。
・[read_private]、[write_private]にチェックを付けて[変更]をクリック
・コマンドを実行してtokenを入手
*ローカルで実行していなかったのでURLをブラウザに貼り付けてブラウザで発行されたPINを「Please input PIN code」の後ろに貼り付ける。
特にトークン発行のところが慣れないと嵌りやすいです。
まぁほぼほぼコピペですが。なんとか無事に動きました。はてブがあれげなら
twitterでやるという手もあるけどそちらも結構制限が固いので何とも言えない。
API取るまでのハードルが高いらしいけど、ここ見て申請中です。
あ、BloggerのAPI発行も結構ハードル高かったからやり方残しておかないとなぁ。
https://syncer.jp/hatebu-api-matome
で、どうやって発行したのか試行錯誤の過程がまるで残っていないので、非常に困った。
将来の自分が同じようなことで困ったときに備えてはてなのAPIを使うためのシークレットの発行方法とかまとめておくことにしました。
◆APIキー発行までの作業
1.APIの有効化
・以下のURLにアクセスする。http://developer.hatena.ne.jp/
・[アプリケーション登録]をクリックする。
・[新しいアプリケーションの追加]をクリック
・[アプリケーションの名称]、[アプリケーションの説明]、[アプリケーションのURL]を入力する。
・[read_private]、[write_private]にチェックを付けて[変更]をクリック
2.OauthKey発行プログラム
・以下のコードを[oauth_consumer.py]という名前で保存import urllib import webbrowser import requests from requests_oauthlib import OAuth1 API_KEY = 'OAuth Consumer Key' SECRET_KEY = 'OAuth Consumer Secret' request_url = 'https://www.hatena.ne.jp/oauth/initiate?scope=read_public%2Cread_private%2Cwrite_public%2Cwrite_private' authorize_url = 'https://www.hatena.ne.jp/oauth/authorize' access_token_url = 'https://www.hatena.ne.jp/oauth/token' callback_uri = 'oob' def oauth_requests(): # Get request token auth = OAuth1(API_KEY, SECRET_KEY, callback_uri=callback_uri) r = requests.post(request_url, auth=auth) request_token = dict(urllib.parse.parse_qsl(r.text)) # User Authorization print('%s?oauth_token=%s&perms=delete' % (authorize_url, request_token['oauth_token'])) oauth_verifier = input("Please input PIN code:") auth = OAuth1( API_KEY, SECRET_KEY, request_token['oauth_token'], request_token['oauth_token_secret'], verifier=oauth_verifier) r = requests.post(access_token_url, auth=auth) access_token = dict(urllib.parse.parse_qsl(r.text)) return access_token if __name__ == '__main__': print(oauth_requests())
・コマンドを実行してtokenを入手
$ python oauth_consumer.py https://www.hatena.ne.jp/oauth/authorize?oauth_token=XXXXX&perms=delete Please input PIN code:XXXXXX {'oauth_token': '', 'oauth_token_secret': '', 'url_name': '', 'display_name': ''}
*ローカルで実行していなかったのでURLをブラウザに貼り付けてブラウザで発行されたPINを「Please input PIN code」の後ろに貼り付ける。
◆動作確認用プログラム
# coding: utf-8 from apiclient.discovery import build import argparse import httplib2 import json import requests from requests_oauthlib import OAuth1Session from requests_oauthlib import OAuth1 import os import pprint import sys import time import traceback import yaml from oauth2client.client import OAuth2WebServerFlow from oauth2client import tools,file def get_authkey(snsname): """ ymlファイルから設定情報を取得する。 """ try: with open('../config/sns_config.yml', 'r') as yml: config = yaml.safe_load(yml) if snsname == 'blogger': client_id = config[snsname]['client_id'] client_secret = config[snsname]['client_secret'] scope = config[snsname]['scope'] redirect_uri = config[snsname]['redirect_uri'] post_blog_id = config[snsname]['post_blog_id'] result = dict( ci=client_id,cs=client_secret, sc=scope,ru=redirect_uri,pb=post_blog_id ) else: consumer_key = config[snsname]['consumer_key'] consumer_secret = config[snsname]['consumer_secret'] token = config[snsname]['token'] token_secret = config[snsname]['token_secret'] result = dict( ck=consumer_key,cs=consumer_secret, at=token,ats=token_secret ) return result except Exception as e: t, v, tb = sys.exc_info() print(traceback.format_exception(t,v,tb)) print(traceback.format_tb(e.__traceback__)) def post_hatena(postword,url,tags): """ はてなブックマークに追加 """ try: ta = get_authkey('hatena') auth = OAuth1(ta['ck'],ta['cs'],ta['at'],ta['ats']) bookmark_api_url = "https://bookmark.hatenaapis.com/rest/1/my/bookmark" tagstr ="" for t in tags: tagstr = tagstr + "&tags=" + t req = requests.post( bookmark_api_url + "?url=" + url + "&comment=" + postword + tagstr + "&post_twitter=1",auth=auth ) if req.status_code == 200: print('SUCCESS') else: print("ERROR : %d" % req.status_code) print(req.headers) print(req.text) except Exception as e: t, v, tb = sys.exc_info() print(traceback.format_exception(t,v,tb)) print(traceback.format_tb(e.__traceback__)) def getpostdata(inputfile_name): """ 投稿用データ取得 """ try: #ファイルオープン with open(inputfile_name) as f: r = [e for inner_list in json.load(f) for e in inner_list] return r except Exception as e: t, v, tb = sys.exc_info() print(traceback.format_exception(t,v,tb)) print(traceback.format_tb(e.__traceback__)) def main(): """ 主処理 """ try: start_t = time.perf_counter() print('Please input inputfilename') input_file = input('>>') if not input_file: print("Please input inputfilename!!") sys.exit() json_data = getpostdata(input_file) cnt = 1 for s in json_data: content = ohtml.format(s['category'], s['name'], s['title'], s['link'], s['updated']) comment = 'テスト' + str(cnt) tags=[] tags.append(s['category']) bookmark_url = s['link'] time.sleep(1) post_hatena(comment,bookmark_url,tags) cnt +=1 end_t = time.perf_counter() process_time = end_t - start_t print('処理時間は:{0}秒です。'.format(process_time)) except Exception as e: t, v, tb = sys.exc_info() print(traceback.format_exception(t,v,tb)) print(traceback.format_tb(e.__traceback__)) if __name__ == '__main__': main()
特にトークン発行のところが慣れないと嵌りやすいです。
まぁほぼほぼコピペですが。なんとか無事に動きました。はてブがあれげなら
twitterでやるという手もあるけどそちらも結構制限が固いので何とも言えない。
API取るまでのハードルが高いらしいけど、ここ見て申請中です。
あ、BloggerのAPI発行も結構ハードル高かったからやり方残しておかないとなぁ。
◆参考サイト
OAuth関連
http://developer.hatena.ne.jp/ja/documents/auth/apis/oauth/consumerAPI使い方関連
http://developer.hatena.ne.jp/ja/documents/bookmark/apis/resthttps://syncer.jp/hatebu-api-matome
コメント