0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

arXivとSlackAPIを利用して論文を定期通知してみた

Posted at

おはこん

おはこんばんにちはUniyaです
自身が興味のある分野に関しての論文は読むが,それ以外は調べることが億劫です.そこで毎日何かしらの自身があまり調べない論文テーマに目を通すため,
arXivから曜日別にテーマを指定し,そのテーマの論文をSlackへ定期的に流すプログラムを組んでみました.

この記事では,上記のプログラムの核となる下記の内容を紹介します.

  • 論文取得
  • Slackへ通知
  • 定期実行

論文取得

# 論文の取得
def get_arXive_paper(getArticleValue):
    url = "http://export.arxiv.org/api/query"
    payload = {
        "search_query": getArticleValue,
        "max_results": 3,
        "sortBy": "submittedDate",
        "sortOrder": "descending"
    }   
    response = requests.get(url, params=payload)
    return response.content.decode("utf-8")

# 検索する論文な内容をサーチ
for i in range(3):
    entry = random.choice(entries)
    title = entry.find("{http://www.w3.org/2005/Atom}title").text
    authors = [author.find("{http://www.w3.org/2005/Atom}name").text for author in entry.findall("{http://www.w3.org/2005/Atom}author")]
    summary = entry.find("{http://www.w3.org/2005/Atom}summary").text
    message = template.format(title, ", ".join(authors), summary)

解説

get_arXive_paper関数が引数として受け取るgetArticleValueを定義しています.引数には指定したカテゴリの論文が入っています.

payloadではAPIに送信するパラメータを定義しています.max_resultsには、検索結果の最大件数を指定します.sortByには,ソート対象となる項目を指定します.sortOrderには、ソートの方向を指定します.

そして,requestsモジュールを使ってAPIにアクセスし,レスポンスを取得しています.getメソッドにより,URLとパラメータを渡してリクエストを送信し,その結果をresponse変数に格納しています.

最後に,取得したレスポンスの内容をUTF-8文字列に変換して、呼び出し元に返しています。

Slackへ通知

client = WebClient(token=Slack_BOT_APIKey)
try:
    response = client.chat_postMessage(
    channel="#テスト",
    text=message
    )
    print("Message sent: ", message)
    except SlackApiError as e:
        print("Error sending message: {}".format(e))

解説

SlackAPIを用意し,WebClientを作成します.
try文で,任意のチャンネルへchat_postMessageメソッドを使用してメッセージを送信してます.

定期実行

def task():
    print("hogehoge")

if __name__ == "__main__":
    schedule.every().day.at("7:00").do(task)
    while True:
        schedule.run_pending()
        time.sleep(1)

解説

schedule.every()で定期実行するための関数を登録しています.また指定する時間もここで示しておきます.
schedule.ran_pending()で登録したジョブを実行します.do()内で実行させたい関数を指定しましょう.またこのままでは一回しか実行されないため,無限ループを用いてschedul.run_pending()を呼び出しています.より詳しいscheduleライブラリの利用は参考文献にリンクがあります.

課題

今回arXivから論文取得を取得し定期的にSlackの方へ通知するプログラムを作成しました.しかし,本プログラムでは実行シェルを閉じると,プログラムが停止してしまします.これを改善するために,サーバー上で実行するなどの必要があります.そういった点も改善できれば本記事に追記していこうと考えてます.
最後までご高覧くださりありがとうございます.

参考文献

全体コード

今回作成したコードは以下のリポジトリにて公開しています.
コードの全体が見たい方は以下のリンクからアクセスをお願いします
Githubへのリンク

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?