GitHub APIに基づいたTwitterボットの作成

こんにちは、Habrasociety様。



今日は金曜日です。つまり、真面目なプロジェクトから逃れてリラックスすることができます。 たとえば、初心者向けの別の記事を読んだ後、いくつかのタイプのGitHubアクティビティを通知するpythonの単純なtwitterボットの開発に専念しています。



この記事から新しいことを学んでいないと思われる場合は、GitHubのプロジェクトコードをご覧ください 。 GitHub API v3とやり取りするためのライブラリーについてさらに学び、ボットの作成プロセスに精通するように、私は猫の下で残りを招待します。









Habrahabrでは、GitHubのAPIを使用すると、Twitter用のボット( [1][2][3] 、...)の作成に関するチュートリアルを簡単に見つけることができます。 これがおそらく、このメモが表示される主な理由です。 さらに、あなたが前に私たちに利用できる巨大な機会を使用するのは簡単な例です。



Github API


現在、APIの現在のバージョンは3番目です(最初の2つのサポートは今年6月にキャンセルされました)。 Pythonを使用して作業するには、非常によく似た少なくとも 6つのライブラリがあります。 便利なドキュメントの入手可能性と多数の依存関係がないことに基づいて、ライブラリを選択しました。 最も楽しいと思われたgithub3.py



Twitter API


Twitterはほとんど必要ありませんでした-ログインし、新しいメンションを受信し、メッセージを送信できる必要がありました。 トークンは手動で取得できます(一度発行されるため、更新する必要はありません)。 したがって、私は3番目のpythonに移植されたoauthライブラリに落ち着きました。



ボット開発


ボットは次のように動作すると想定されていました。



プロジェクトの構造は次のとおりです。





oauthフォルダーには、認証用のライブラリが含まれています。twitter.pyファイルには、メッセージを送信してフィードを更新するためのメソッドがあります。実際、github.pyはボット自体であり、id.datは最後に処理されたメッセージ仕事)。 Config.pyはキーとパスワードを保存するために必要です。



Twitter APIを使用するには、独自のアプリケーションを作成する必要があります。 dev.twitter.comにログインし、「アプリの作成」をクリックして、フォームに記入し、アプリケーションを作成します。 メッセージを送信するには、[設定]セクションで[読み取りと書き込み]モードを有効にする必要があります。 キーを取得する(「詳細」タブの「アクセストークンを作成する」)ため、そのまま続行できます。



twitter.py


完全なコードへのリンクは記事の最後にあります。ここに簡単な抜粋のみを示します。



まず、ボットにTwitterへのログイン、リクエストの送信、最後のメッセージの数の保存を教えます。

HOME_TIMELINE_URL = 'http://api.twitter.com/1/statuses/home_timeline.json' UPDATE_URL = 'http://api.twitter.com/1/statuses/update.json' MENTIONS_URL = 'http://api.twitter.com/1/statuses/mentions.json' FILENAME = 'id.dat' # File with the number of the last solved problem
      
      





テープを更新するには、接続するだけです:

 def _get_connection(self): self.connection = http.client.HTTPConnection('twitter.com')
      
      





そして、POSTリクエストを送信します。

 oauth_request = oauth.OAuthRequest.from_consumer_and_token( self.consumer, token=self.access_token, http_method='POST', http_url=UPDATE_URL, parameters=params) oauth_request.sign_request(self.signature_method, self.consumer, self.access_token) self.connection.request(oauth_request.http_method, UPDATE_URL, headers=oauth_request.to_header(), body=self._to_query_string(params))
      
      





そして言及を得るには-GETリクエスト:

 oauth_request =\ oauth.OAuthRequest.from_consumer_and_token(self.consumer, token=self.access_token, http_method='GET', http_url=MENTIONS_URL, parameters=params) oauth_request.sign_request(self.signature_method, self.consumer, self.access_token) self.connection.request(oauth_request.http_method, MENTIONS_URL + '?' + self._to_query_string(params), headers=oauth_request.to_header())
      
      





情報を保存するには、ピクルライブラリを使用できます。

 def _save(self, data): path = os.path.dirname(__file__) path = os.path.join(path, FILENAME) log_file = open(path, 'wb') pickle.dump(data, log_file) log_file.close()
      
      





原則として、これで十分です。 次に、config.pyファイルを作成します。このファイルには、Twitter API用に受け取ったキーと、GitHubユーザーのログイン/パスワードが格納されます(ボットが必要な場合)。

 import twitter secret = twitter.SecretKeys('consumer_key', 'consumer_secret', 'auth_key', 'auth_secret') LOGIN = 'github_login' PASSWORD = 'github_password'
      
      





そしてそれらを保存するシェルを追加します:

 class SecretKeys: keys = {} def __init__(self, consumer_key, consumer_secret, auth_key, auth_secret): self.keys = {'consumer_key': consumer_key, 'consumer_secret': consumer_secret, 'auth_key': auth_key, 'auth_secret': auth_secret}
      
      







github.py


ボット自体からもう少し必要です。 彼は新しいメッセージのリストをダウンロードし、それらからタスクのリストを作成し、タスクを完了し、結果をユーザーに通知します。

まず、次のライブラリが必要です。

 from github3 import login import twitter # twitter.py import time import os import pickle from config import secret, LOGIN, PASSWORD
      
      





ファイルから最後のメッセージの番号を取得します。

 def get_data(filename): with open(filename, 'rb') as file: return pickle.load(file)
      
      





twitter.pyから新しいタスクのリストを取得します。

 list_of_problems = api.get_new_mentions(idx)
      
      





それに沿って、新しいチームを形成します。

 for problem in list_of_problems: problem = form_problem(problem)
      
      





form_problem()関数は、ユーザーがボットに正確に望むものを検索し、パラメーターを使用して辞書を作成します。

 if command in commands: command = commands.index(command) user = problem['user']['screen_name'] return {'command': command, 'user': user, 'params': params}
      
      





次に、各タスクを完了する必要があります。

 def solve(problem, gh): functions = {0: get_last_commit, 1: get_list_of_contributors, 2: get_count_of_open_issues, 3: get_count_of_commits, 4: get_count_of_repos, 5: subscribe_on_commits, 6: help, 7: unsubscribe_from_commits} return functions[problem['command']](gh, problem['params'], problem['user'])
      
      





結果をユーザーに送信:

 api.post_update('@%s %s.' % (problem['user'], result))
      
      





そして、少し間を置きます。

 time.sleep(10)
      
      





原則として、これは最初のバージョンでは十分です。 関数自体は、GitHub APIとgithub3.pyのドキュメントに完全に基づいています。 たとえば、リポジトリ内の最後のコミットの出力は、次のように実装できます。

 def get_last_commit(gh, params, user): pattern = 'Last commit in "%s" was "%s" by %s' repository = gh.repository(params[0], params[1]) last_commit = repository.list_commits()[0] return pattern % (repository.name, last_commit.commit.message, last_commit.commit.author.name)
      
      





GitHub APIの観点から見ると、これはGETリクエスト(/ repos /:user /:repo / commits)であり、これに応じて、サーバーはかなり広範な情報を含むリポジトリ内のすべてのコミットのリストを返します。





おそらくこれがすべてです。 ボットを開始するには、config.pyを事前に入力してgithub.pyファイルを実行するだけです。 GitToTweetは現在、次のコマンドをサポートしています。




All Articles