Twitterに引き続き、SNSへの自動投稿方法についてまとめておこうと思います。
Twitterでの自動投稿、データ収集と同様にgo言語での自動投稿方法についてまとめておこうと思います。
■LINE Developersへの登録
LINEでの自動投稿を行うためのAPIを利用出来るようにするために、LINE Developersへの登録が必要になります。
LINE Developersへの登録とチャンネル登録までの手順はこちらに載っております。
こちらのサイトを元に登録をお願いいたします。
qiita.com
実際に下記コマンドを実行して、LINEでHello, worldが受信出来ればOKになります。
curl -v -X POST https://api.line.me/v2/bot/message/push \ -H 'Content-Type:application/json' \ -H 'Authorization: Bearer { アクセストークン }' \ -d '{ "to": "ユーザID", "messages":[ { "type":"text", "text":"Hello, world" } ] }'
もし受信できない場合には、もしかしたら
HTTP/1.1 401 Unauthorized
が返ってきている可能性があります。
この場合、ユーザIDやアクセストークンなどが誤っている可能性があります。
LINE Developersの専用サイトを再度ご確認の上、パラメータが誤っていないか確認をお願いいたします。
https://developers.line.biz/console/
■go言語でのLINE投稿
先ほどcurlで実施した内容をgo言語で置き換えればOKになります。
要するに
https://api.line.me/v2/bot/message/push
宛てに、Headerに認証などを指定してPOST送信を行えばOKです。
まずはコードです!!
こちらになります。
package main import ( "bufio" "bytes" "fmt" "net/http" "os" ) func main() { payload := `{ "to": "ユーザID", "messages": [{ "type": "text", "text":" Hello World" }] }` req, _ := http.NewRequest( "POST", "https://api.line.me/v2/bot/message/push", bytes.NewReader([]byte(payload)), ) req.Header.Set("Content-Type", "application/json") req.Header.Set("Authorization", "Bearer {アクセストークン}") _, err := http.DefaultClient.Do(req) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } }
まず、送信先のユーザIDや送信メッセージを定義します。
payload := `{ "to": "ユーザID", "messages": [{ "type": "text", "text":" Hello World" }] }`
そして、POSTリクエストを定義します。
req, _ := http.NewRequest( "POST", "https://api.line.me/v2/bot/message/push", bytes.NewReader([]byte(payload)), )
送信するデータは先ほどのpayloadをbyte変換が必要になります。
先ほどのPOSTリクエストにHeaderを追加します。
req.Header.Set("Content-Type", "application/json") req.Header.Set("Authorization", "Bearer {アクセストークン}")
アクセストークンもこちらのHeaderから追加します。
そして、、、、最後に、、、
_, err := http.DefaultClient.Do(req) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) }
にてPOSTリクエストを実行します!!
もしPOSTリクエスト失敗した場合には、
mt.Fprintln(os.Stderr, err)
によりエラーメッセージが受信できます。
■おまけ
おまけとして、テキストファイルに記載した文章をLINEに投稿するコードを載せておきます。
やっていることは、ファイル読み出し(fileRead()関数)でファイルを読み出し文字列として抽出。
そして、先ほどのコードでLINEで投稿しているのみです。
import ( "bufio" "bytes" "fmt" "net/http" "os" ) func main() { payload := `{ "to": "ユーザID", "messages": [{ "type": "text", "text":"` + fileRead() + `" }] }` req, _ := http.NewRequest( "POST", "https://api.line.me/v2/bot/message/push", bytes.NewReader([]byte(payload)), ) req.Header.Set("Content-Type", "application/json") req.Header.Set("Authorization", "Bearer {アクセストークン}") _, err := http.DefaultClient.Do(req) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } } func fileRead() string { f, err := os.Open("file.txt") if err != nil { fmt.Println("error") } defer f.Close() scanner := bufio.NewScanner(f) b := "" for scanner.Scan() { b += scanner.Text() + ` \n ` } return string(b) }