見出し画像

「Amazon価格ツイート」アプリ作成⑤ 取得データをTwitterに投稿

どうも、タケオです。
今回はAmazonから取得したデータをTwitterに投稿したいと思います。

パッケージのインストール

Tweepy

Googleのテスト環境では既に利用可能でしたが、新たにインストールした環境にはTweepyが入っていないためインストールします。

コマンドプロンプトを起動し、以下のコマンドを実行します。

pip install tweepy
Tweepyのインストール

ちょっと警告が出ていますが、Pythonのインストール先を変更したことによるものなので無視してください。コマンドプロンプトを管理者権限で実行するとこの手間は省けます。この後インストールし直しました。

念の為、正しくインストールされているか確認します。
コマンドプロンプトに以下のコマンドを入力してください。

pip list
インストール済みのライブラリ

ソースの修正

前回は特定の商品のみを取得しましたが、今回は検索条件を指定して取得し、その内容をそのままツイートします。
またAmazon API クラスは外部ファイル化してあります。

サンプルコード

from Lib import AwsV4
import json
import requests
import tweepy

# TwitterAPI情報を記入
API_KEY             = "APIキー"
API_SECRET          = "APIシークレット"
ACCESS_TOKEN        = "アクセストークン"
ACCESS_TOKEN_SECRET = "アクセストークンシークレット"

# Amazon API
SERVICE_NAME = "ProductAdvertisingAPI"
REGION       = "us-west-2"
PARTNER_TAG  = "パートナータグ"
ACCESS_KEY   = "アクセスキー"
SECRET_KEY   = "シークレットキー"

HOST         = "webservices.amazon.co.jp"

# SearchItems
URI_PATH       = "/paapi5/searchitems"
OPERATION      = "SearchItems"
RESULT         = "SearchResult"
KEY_WORDS      = "蒼き鋼のアルペジオ"
BRAND          = "少年画報社"
BROWSE_NODE_ID = "2278488051"
SORT_BY        = "NewestArrivals"
ITEM_COUNT     = 3  #取得する情報数


def getMessage():   # 受信結果からツイート内容を形成    
    responses = getResponse()
    if (RESULT in responses):
        for item in responses[RESULT]["Items"]:
            message=''
            message += item["ItemInfo"]["Title"]["DisplayValue"] + "\r\n"
            message += item["Offers"]["Listings"][0]["Availability"]["Message"] + "\r\n"
            message += item["DetailPageURL"] + "\r\n"
            
            # Tweet
            print(message)
            sendTwitter(message)

    else:
        message += "データの取得に失敗しました。"
        print(message)
    
def getResponse():  # Amazon API からデータを取得
    # create payload
    payload = "{"
    payload += " \"Keywords\": \"" + KEY_WORDS + "\","
    payload += " \"Resources\": ["
    payload += "  \"ItemInfo.ByLineInfo\","
    payload += "  \"ItemInfo.ContentInfo\","
    payload += "  \"ItemInfo.ContentRating\","
    payload += "  \"ItemInfo.Classifications\","
    payload += "  \"ItemInfo.ExternalIds\","
    payload += "  \"ItemInfo.Features\","
    payload += "  \"ItemInfo.ManufactureInfo\","
    payload += "  \"ItemInfo.ProductInfo\","
    payload += "  \"ItemInfo.TechnicalInfo\","
    payload += "  \"ItemInfo.Title\","
    payload += "  \"ItemInfo.TradeInInfo\","
    payload += "  \"Offers.Listings.Availability.Message\","
    payload += "  \"Offers.Listings.Availability.Type\","
    payload += "  \"Offers.Listings.Condition\","
    payload += "  \"Offers.Listings.MerchantInfo\","
    payload += "  \"Offers.Listings.Price\","
    payload += "  \"Offers.Listings.ProgramEligibility.IsPrimeExclusive\","
    payload += "  \"Offers.Listings.ProgramEligibility.IsPrimePantry\","
    payload += "  \"Offers.Listings.SavingBasis\","
    payload += "  \"Offers.Summaries.HighestPrice\","
    payload += "  \"Offers.Summaries.LowestPrice\","
    payload += "  \"Offers.Summaries.OfferCount\","
    payload += "  \"ParentASIN\""
    payload += " ],"    
    payload += " \"Brand\": \"" + BRAND + "\","
    payload += " \"BrowseNodeId\": \"" + BROWSE_NODE_ID + "\","
    payload += " \"SortBy\": \"" + SORT_BY + "\","
    payload += " \"ItemCount\": " + str(ITEM_COUNT) + ","
    payload += " \"Merchant\": \"Amazon\","
    payload += " \"PartnerTag\": \"" + PARTNER_TAG + "\","
    payload += " \"PartnerType\": \"Associates\","
    payload += " \"Marketplace\": \"www.amazon.co.jp\","
    payload += " \"Operation\": \"" + OPERATION + "\""
    payload += "}"

    print(payload)
    
    # create header
    awsv4 = AwsV4.AwsV4(ACCESS_KEY, SECRET_KEY)
    awsv4.setRegionName(REGION)
    awsv4.setServiceName(SERVICE_NAME)
    awsv4.setPath(URI_PATH)
    awsv4.setPayload (payload)
    awsv4.setRequestMethod ("POST")
    awsv4.addHeader('content-encoding', 'amz-1.0')
    awsv4.addHeader('content-type', 'application/json; charset=utf-8')
    awsv4.addHeader('host', HOST)
    awsv4.addHeader('x-amz-target', 'com.amazon.paapi5.v1.ProductAdvertisingAPIv1.' + OPERATION)
    headers = awsv4.getHeaders()

    try:
        response = requests.post('https://' + HOST + URI_PATH, headers=headers, data=payload.encode("utf-8"))
        json_response = json.loads(response.text)
        return json_response
    except :
        pass
        return {"Result": "error"}


def sendTwitter(msg):  # ツイートを送信

    # Twitterライブラリの呼び出し
    auth = tweepy.OAuthHandler(API_KEY, API_SECRET)
    auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
    api = tweepy.API(auth)
        
    # メッセージをツイート
    if msg != '':
        api.update_status(msg)
        
if __name__ == '__main__':
    getMessage()

ツイートを送信

前回同様パートナータグなど必要な情報を入力し、コマンドプロンプトから実行します。
エラーがなければそのまま処理が終了しますので、Twitterを確認してみましょう。

Twitter投稿

今回は3件抜き出したので、そのまま3件の投稿が完了していました。
リンクも正しく認識している様なので安心です。

というわけで

今回は簡単にここまでにしておきます。
今回の処理の注意点としては、検索条件(payload)に日本語が入ってきているので、データを取得する際にUTF−8を指定し忘れない様にしてください。
また、上記のコードには十分なエラー対策や遅延処理などは入っていませんので、その点もご注意ください。


ツイートに使った予約情報です。

この記事が気に入ったらサポートをしてみませんか?