arXiv を DeepL して Slack する Bot を Github Action で作った話





## この記事は


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/cdc71be3-0335-32e9-5794-1e6f12e7f5d2.png)


「arXiv を Deepl して Slack する Bot を Github Action で作った話」 



## 作ったもの

- [peace098beat/arxivot: arXivを検索してslackでつぶやっく](https://github.com/peace098beat/arxivot)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/e9934258-9ac9-0764-2db4-35cc2f4d0b8b.png)


## こんなことありませんか?

- arXivの新着チェックしたい!
- 毎日N件アップされる!
- 英語で読むの辛くなる .. orz
- Deeplで翻訳して読む!
- 毎回Ctrl+C, Ctrl+Cが疲れてくる .. orz
- そして、電車だとDeepl使うの面倒 .. orz
- そもそもチェックするの忘れる ... orz
    - (先週の自分) 「よし、今日から毎日やるぞー！ 」
    - (今週の自分) 「あ、忘れてた一日しかやってない.. よし、今日からんpなぽうwfー！！」
- bot化するぞー！
- サーバーが必要 .. orz
	- GCP? AWS? CRON実行? デプロイ? 料金？ サーバレス? FaaS? ... orz


## そんなあなたに

「Github リポジトリをフォークするだけで使える arXiv botのお知らせです」

(略してarXivotです)

毎日論文チェックする方に、需要あれば嬉しいです。

できるだけ、クラウドに詳しくない方でも、github アカウントさえあれば使えるようにしてます。


## 過去記事調査

Qiitaでは`arxiv`タグがついた記事は`37`記事ありました。

通知機能を実装している記事や、Twitterの反応でフィルタしているbotなど、参考になる記事が多数ありました。

- [arxivの最新論文を和訳してslackで自動通知してみた! - Qiita](https://qiita.com/Hiroaki-K4/items/579014b41adc85fe919f)
- [自動でArxivから論文を取得して、日本語に直してLineに投稿すれば、受動的に最新情報が収集できるかも！？ - Qiita](https://qiita.com/sugup/items/31911ae21c17a1de89ad)
- [最新のarXivから、Twitterで反応の大きい論文だけつぶやくbot作りました - Qiita](https://qiita.com/kj_ini77/items/11057fab98036ca2a3c0)
- [Tatsuya Shirakawa Researcher at ABEJA, inc. Hot arXiv Papers](https://modest-wright-7aaa9e.netlify.app/)

前提として、私の場合は、時系列分析系の専門なので、`Time Series`というワードを追いかけています。
なので、画像のように毎日数十件オーダーで新着がある訳ではないので、高度なTwitterの反応フィルタなどは必要ないと判断しました。

(もし、画像系などでTwitterの反応でフィルタされた結果が欲しい方は上の記事がおすすめです.)


過去記事では、`Github Action`を利用してbot化する記事が見当たらなかったので投稿させていただきました.


## Github Actionを使ってみて良いなと思ったこと

- 設定変更が楽すぎる
    - 検索したいワードの変更を、github上のエディタで変更するだけでOK
    - (さらに、検索ワードを環境変数で管理する仕組みにしておけばさらによかった..orz )
- リポジトリと定期実行を同時に管理できるので楽でした.



## 何をしているのか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/5ce81c28-d67b-f07e-fca1-545f59d736ef.png)


1. arxivの検索ページで、引数していしたワードを検索
	- [Search | arXiv e-print repository](https://arxiv.org/search/?query=time+series&searchtype=all&abstracts=show&order=-announced_date_first&size=50)
2. 引数指定したトップN件を取得
3. BeautifulSoup4でパース
4. API経由でDeeplにて日本語に翻訳
5. 整形してSlackに通知

この一連の動作をPythonで書いて、
あとは、Github Actionで定期的に実行してます。

![スクリーンショット 2020-12-11 16.53.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/81259928-4b49-90eb-f496-ef24f3ac9f76.png)
検索結果上位のポストが翻訳と一緒に呟かれているのがわかります。

## 必要なもの

- Github アカウント
- SlackのIncoming WebHookのキー
- DeeplのAPIキー

DeepLとSlackの各API取得方法などは他の記事にお任せしますmm

[DeepL API を使ってみる - Qiita](https://qiita.com/rihok/items/962890b4b86ea052e54c#%E9%96%8B%E7%99%BA%E8%80%85%E5%90%91%E3%81%91)
https://www.deepl.com/pro-account.html

## 使い方

### 1. リポジトリをフォークする

以下のURL先のリポジトリをフォークしてください。
https://github.com/peace098beat/arxivot

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/988691a7-1142-cdd3-9518-83222832ae86.png)

### 2. 「Settings」>「Secrets」にて`環境変数`をセットします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/84364197-2a1f-2dda-6486-0388596572e0.png)

変数名は`DEEPL_TOKEN`, `SLACK_HOOK_URL`としてください.

DeepLとSlackの各API取得方法などは他の記事にお任せしますmm



### 3.「Actions」からActionを新規作成
![スクリーンショット 2020-12-11 16.32.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/34e1d937-c7e8-9bfc-d2f6-0a4d9336ea87.png)


### 4. 左サイドバーからActionを実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/23c85772-5d0f-ea8a-9737-bb0c82af01e0.png)



Actionが実行されます。



## 発展

github actionに呼び出される設定ファイルを変更することで、動作を変更できます.

設定ファイルは`.github/workflows/python-app-2.yml`です.


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/2d2f45d5-886b-3870-d82d-8e7f2131249b.png)


#### 検索ワード変更 
 - 引数 `--search_word`を変更ください.

```yaml
# 単語
PYTHON_PATH=src python src/main.py --top=10 --search_word='"recommendation"'    
# 複数単語
PYTHON_PATH=src python src/main.py --top=10 --search_word='"anomaly+detection"' 
```


#### CRONの設定変更

デフォルトでは、毎朝6:00に実行されます.

```yaml
on:
  workflow_dispatch:
  schedule:
    - cron:  '0 21 * * *'
```

設定ファイルでは `+9時間` なので注意!

[GitHub Actionsのワークフロー構文 - GitHub Docs](https://docs.github.com/ja/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#onschedule)

#### 投稿する論文数の変更

- 引数の`--top=`を変更してください

```yaml
# トップ10件の場合
PYTHON_PATH=src python src/main.py --top=10 --search_word='"time+series"'

# トップ30件の場合
PYTHON_PATH=src python src/main.py --top=30 --search_word='"time+series"'

```

(件数が多くなるとその分DeepLの課金が増えるので注意!)



## DeepLの費用感

毎日10件ほど呟いた結果です。
(たまに大きな文字数になっているのは、テストで呟く頻度や量を増やしたためです。)

![スクリーンショット 2020-12-11 16.39.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/71937c19-8a44-bf8b-e6e4-3345c23b1e20.png)

毎月の費用は1500円くらいです.

![スクリーンショット 2020-12-11 16.39.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/633f9778-a021-590c-58d8-b0c66da3d610.png)



## 最後に

先ほど別のアカウントで動作検証したところ問題なく動きました。
ご興味ある方は、DeeplとSlack HookのAPIキーを取得したあと、
Githubリポジトリをフォークしていただき、環境変数にAPIキーを登録するだけで動くつもりです。




## ABEJAでは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62413/de94773e-0530-2f45-0034-ac0d8ef83768.png)

[ABEJAでは一緒に仕事をする仲間を募集しています!!](https://hrmos.co/pages/abeja/jobs)
興味がある方がいましたら、カジュアル面談からでも、気軽にご連絡ください!!