Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

Go言語でのLINE 自動投稿方法まとめ

Twitterに引き続き、SNSへの自動投稿方法についてまとめておこうと思います。
Twitterでの自動投稿、データ収集と同様にgo言語での自動投稿方法についてまとめておこうと思います。
f:id:Elsammit:20210117172954p:plain



■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)
}

■最後に

Twitterに引き続きLINEについてもAPIを用いて自動投稿する方法をまとめました。
友人の一人に複数SNSに同じような投稿している方がいるので、その人にこちらのコード渡そうかな?🤔