はてなブックマークを投稿するためのpython

はてブの投稿用のpythonスクリプトでボットしてたらあれげなことになってしまったので取りあえずアカウント復活のためにメールで問合せしつつも、結局はAPIは使えない状態になったので結局ConsumerKeyとか全部発行しなおさないといけない。
で、どうやって発行したのか試行錯誤の過程がまるで残っていないので、非常に困った。
将来の自分が同じようなことで困ったときに備えてはてなの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/consumer


API使い方関連

http://developer.hatena.ne.jp/ja/documents/bookmark/apis/rest
https://syncer.jp/hatebu-api-matome

コメント

このブログの人気の投稿

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

証券外務員1種勉強(計算式暗記用メモ)

マクロ経済学(IS-LM分析)