スナックelve 本店

バツイチ40代女の日記です

1分おきに期間限定無料の漫画をツイートする

DMMのアフィリエイト申し込んでwebサービスでID保存しとく
楽天アフィリエイト申し込んで楽天ウェブサービスでID保存しておく
twitterのなんかID取得しておく。

やることは

  1. DMMから無料本の情報取得
  2. Koboから無料本の情報取得
  3. 1分おきにツイート
  • 生成時のツイート用情報はt_yyyymmddhhmm_ストア名__freeComicInfo.jsonに保存される。
  • ツイート後はyyyymmddhhmm_ストア名__freeComicInfo.jsonにリネームする
import requests
import urllib.parse
import json
import datetime
from twitter_text import parse_tweet
from os import rename
import glob
import json
from time import sleep
import tweepy

# ファイル名生成


def getFilename(kind):
    # 今の日時からファイル名を作成
    dt_now = datetime.datetime.now()
    fName = 't_'+dt_now.strftime('%Y%m%d%H%M%S') + \
        '_' + kind+'_freeComicInfo.json'
    f = open('./'+fName, 'w', encoding='utf-8')
    f.close()
    return fName

# urlパラメータ生成


def getApiUrl(reqUrl, para):
    urlPara = urllib.parse.urlencode(para)
    return reqUrl + urlPara

# 結果文字列の整形


def editFreeBookData(url, kind, sakusya, title, number, jsonItem):
    str = '【{0}】{1}の『{2}』{3} 今 0円'.format(kind, sakusya, title, number)
    # jsonの枝(item)作成
    jsonItem.append({'str': str, 'url': url})
    return jsonItem

# ファイル保存


def saveFile(jsonItem, fName):
    # json追加
    jsonItems = {'items': jsonItem}
    # ファイルに保存
    with open('./'+fName, 'a', encoding='utf-8') as f:
        json.dump(jsonItems, f, ensure_ascii=False)


# API情報を記入
BEARER_TOKEN = ''
API_KEY = ''
API_SECRET = ''
ACCESS_TOKEN = ''
ACCESS_TOKEN_SECRET = ''


# クライアント関数を作成
def ClientInfo():
    print("tweet2")
    client = tweepy.Client(bearer_token=BEARER_TOKEN,
                           consumer_key=API_KEY,
                           consumer_secret=API_SECRET,
                           access_token=ACCESS_TOKEN,
                           access_token_secret=ACCESS_TOKEN_SECRET,
                           )

    return client

# ツイート関数


def CreateTweet(message, client):
    print("tweet1")
    try:
        tweet = client.create_tweet(text=message)
        return tweet
    except tweepy.TweepError as e:
        print(e.message[0]['code'])
        print(e.args[0][0]['code'])
        return


def tweetFiles():
    # 対象ファイル取得(t_で始まるファイル)
    targetFiles = glob.glob('./t_*.json')
    for tFile in targetFiles:
        with open(tFile, encoding='utf-8') as f:
            # jsonからitemsを読み込み
            readJson = json.load(f)
            for item in readJson['items']:
                # itemごとに処理
                # urlは切れたら困るから最初に
                m = item['url'] + '\n' + item['str']
                if parse_tweet(m).valid == False:
                    # 文字が長過ぎたら切り詰めていく
                    i = 280
                    while parse_tweet(m).valid == False:
                        m = m[:i]
                        i -= 1
                    # 最後は省略の「…」
                    i -= 2
                    m = m[:i] + '…'
                    print(m)
                # ツイート
                CreateTweet(m)
                # 60秒待つ
                sleep(60)
        # 処理済みファイルの「t_」を削除
        nfilename = tFile[4:]
        rename(tFile, nfilename)


# メイン処理
kinds = ['DMMブックス', '楽天Kobo']
reqUrls = ['https://api.dmm.com/affiliate/v3/ItemList?',
           'https://app.rakuten.co.jp/services/api/Kobo/EbookSearch/20170426?']
paras = [{
    'api_id': 'vVgTxSx9WSzUSKGXCsZt',
    'affiliate_id': 'elve-990',
    'site': 'DMM.com',
    'service': 'ebook',
    'floor': 'comic',
    'hit': 30,
    'offset': 1,
    'keyword': '閲覧期限'
}, {
    'applicationId': '1077688777613086627',
    'affiliateId': '05eff714.c5ceaa1a.05eff716.192055f2',
    'elements': 'title,author,affiliateUrl,itemPrice',
    'formatVersion': 2,
    'koboGenreId': '101904',
    'keyword': '期間限定',
    'hits': 30,
    'sort': 'reviewCount',
    'page': 1
}]
for i in range(len(kinds)):
    fName = getFilename(kinds[i])
    # apiを叩く
    r = requests.get(getApiUrl(reqUrls[i], paras[i]))
    if r.ok:
        ret = r.json()
        jsonItem = []
        # OKだったら/ここはapi分岐するしかない?
        if kinds[i] == 'DMMブックス':
            for item in ret["result"]["items"]:
                if item["prices"]["price"] == 0:
                    authors = item["iteminfo"]["author"]
                    sakusya = ""
                    for author in authors:
                        if sakusya == "":
                            sakusya = author["name"] + "先生"
                        else:
                            sakusya += "、" + author["name"] + "先生"
                    editFreeBookData(
                        item["affiliateURL"], kinds[i], sakusya, item["title"], item["number"], jsonItem)
            saveFile(jsonItem, fName)
        elif kinds[i] == '楽天Kobo':
            for item in ret["Items"]:
                if item["itemPrice"] == 0:
                    sakusya = item["author"] + "先生"
                    editFreeBookData(
                        item["affiliateUrl"], kinds[i], sakusya, item["title"], "", jsonItem)
            saveFile(jsonItem, fName)
# 対象ファイル取得(t_で始まるファイル)
targetFiles = glob.glob('./t_*.json')
client = ClientInfo()
for tFile in targetFiles:
    with open(tFile, encoding='utf-8') as f:
        # jsonからitemsを読み込み
        readJson = json.load(f)
        for item in readJson["items"]:
            # itemごとに処理
            # urlは切れたら困るから最初に
            m = item["url"] + '\n' + item["str"]
            # 文字が長過ぎたら切り詰めていく
            i = 278
            m = m[:i] + "…"
            print(m)
            # ツイート
            CreateTweet(m, client)
            # 60秒待つ
            sleep(60)
    # 処理済みファイルの「t_」を削除
    nfilename = tFile[4:]
    rename(tFile, nfilename)

参考

[解決!Python]バイナリファイルを読み書きするには:pickle編:解決!Python - @IT
[解決!Python]日付や時刻をYYMMDDhhmmssなどの形式に書式化するには:解決!Python - @IT
Python の例外を別の例外として投げるときの話 - サーバーワークスエンジニアブログ
Pythonの2次元配列の使い方!初期化、追加、検索方法まとめ | プログラミングを学ぶならトレノキャンプ(TRAINOCAMP)
【Python】Scheduleモジュールを用いたイベント定期実行|指定時間動作のスケジュール関数作成例と使い方解説
pickle --- Python オブジェクトの直列化 — Python 3.10.6 ドキュメント
【Python】 f-stringの使い方の基本 | Hbk project
Pythonで現在時刻・日付・日時を取得 | note.nkmk.me
Pythonで文字列を分割(区切り文字、改行、正規表現、文字数) | note.nkmk.me
Pythonの例外処理(try, except, else, finally) | note.nkmk.me
pythonでtwitterが扱えるtweepyについて【サンプルコードあり】|python-manブログ
pythonでtwitterが扱えるtweepyについて【サンプルコードあり】|python-manブログ
Python で文字列に変数を埋め込む方法あれこれ - Qiita
Pythonで文字列 <-> 日付(date, datetime) の変換 - Qiita
Pythonでglobモジュールを使う方法【初心者向け】現役エンジニアが解説 | TechAcademyマガジン
python for文を初心者向けに解説!for文基礎はこれで…|Udemy メディア
Python|Udemy メディア
Python3入門 フォルダ内のファイル一覧を取得する方法
Python の辞書の配列またはリスト | Delft スタック
Python | ファイル名またはディレクトリ名を変更する
Python | if文を使った条件分岐
Python | formatメソッドを使った文字列の書式設定
【Python入門】os.renameでファイル名を変更する方法を解説! | 侍エンジニアブログ
python — tweepy例外インスタンスからエラーコードを取得します

結果をツイートしてる垢

よかったらフォローしておくんなまし