以前からの告知通り、 Amazon アソシエイトツールバー で 画像リンク が作成できなくなりました。そこで、引き続き作成可能なテキストリンクから 画像リンク を 生成 するスクリプトを Python で組みました。
アソシエイトツールバーで予告通り画像リンク作成機能廃止
Amazonアソシエイトセントラルで以前より告知されていた通り、
アソシエイトツールバーでの画像リンク作成機能が無くなり、テキストリンク生成のみになってしまいました(2023年1月初め執筆時点)。
試しにこのテキストリンクをWordPressブログに貼り付けてみると(ブラウザはFirefox)、
ジオロケーションを利用しているのか定かではありませんが、これはそのまま使う気にはなれません。
過去の画像リンクを解析
これまでに貼り付けた画像リンク <iframe> タグを読み解くと、
1 2 3 4 5 6 7 8 9 |
<iframe style="width: 120px; height: 240px;" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF& t=servercan-22& language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til& asins=B08JPYYY8R& linkId=dd6f0627030aaa08e0bf21b355a26dcd"> </iframe> |
動的な変数は以下の3っで、
- t : トラッキングID
- asins : 商品ASIN
- linkId: 広告リンクID
このうち商品によって変わるのは asins と linkId の2つ。そしてこれらは、上述のテキストリンク生成で得られる 通常リンク の中に含まれます。
1 2 3 4 5 |
https://www.amazon.co.jp/Youmile-5%E5%80%8B-DC-DC%E9%99%8D%E5%9C%A7%E5%9E%8B%E9%9B%BB%E5%9C%A7%E3%83%AC%E3%82%AE%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF6-24V-12V-24V%E3%81%8B%E3%82%895V%E3%81%AE%E8%BB%8A%E7%94%A8USB%E5%85%85%E9%9B%BB%E5%99%A8%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB3A%E9%99%8D%E5%9C%A7%E9%9B%BB%E5%9C%A7%E3%83%AC%E3%82%AE%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC%E9%9B%BB%E6%BA%90%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%EF%BC%8824AWG%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%BC%E4%BB%98%E3%81%8D%EF%BC%89 /dp/B08PBNCJWJ? __mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=6GC2B3WAJPKU&keywords=dc%E3%82%B3%E3%83%B3%E3%83%90%E3%83%BC%E3%82%BF%E3%83%BC+12v+5v+10a+4+usb&qid=1704161542&sprefix=dc%E3%82%B3%E3%83%B3%E3%83%90%E3%83%BC%E3%82%BF%E3%83%BC+12v+5v+10a+4usb%2Caps%2C182&sr=8-57&linkCode=ll1&tag=servercan-22& linkId=fd63df864eef593632fca3b4ea6c92de& language=ja_JP&ref_=as_li_ss_tl |
ただし、これらの切り貼り手作業で経常的にこなすのは目に酷なので、テキストリンクを元に画像リンク <iframe> を吐き出してくれるようなスクリプトを、Pythonで組んでみようと思います。
画像リンク生成Pythonスクリプトの考察
Pythonスクリプトファイルの実行時にテキストリンクを引数で渡すような運用では、上記の通常リンクは長すぎて引数で渡すことはできません。
そこで、短縮URLの方を引数で渡して、スクリプトの中でURLの展開、解析、画像リンク出力という流れにしようと思います。
短縮URLの展開では、よく requests.get(###).url が使われるのですが、これではクエリ文字列の部分が得られません。
1 2 3 4 5 |
>>> import requests >>> shortlink = "https://amzn.to/48zfiCz" >>> print(requests.get(shortlink).url) https://www.amazon.co.jp/..../dp/B08PBNCJWJ >>> |
あれこれ調べてみた結果、 requests.head(###) でレスポンスヘッダだけを取得して、その中にあるLocationを参照すると、クエリ文字列付きで得られることが分かりました。
1 2 3 4 5 |
>>> import requests >>> shortlink = "https://amzn.to/48zfiCz" >>> res = requests.head(shortlink) >>> print(txtlink) https://www.amazon.co.jp/..../dp/B08PBNCJWJ?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=6GC2B3WAJPKU&keywords=dc%E3%82%B3%E3%83%B3%E3%83%90%E3%83%BC%E3%82%BF%E3%83%BC+12v+5v+10a+4+usb&qid=1704161542&sprefix=dc%E3%82%B3%E3%83%B3%E3%83%90%E3%83%BC%E3%82%BF%E3%83%BC+12v+5v+10a+4usb,aps,182&sr=8-57&linkCode=sl1&tag=servercan-22&linkId=447f2018ada219d569139fbec4d6b096&language=ja_JP&ref_=as_li_ss_tl |
ようやく得られた通常URLの解析は、苦手な正規表現との闘い。オンラインチェッカーに添削してもらいながら、おまじないを探ります。
まずASINは、URLの /dp/ の後方、 ? の前までなので正規表現は、
1 |
(?<=\/dp\/)[A-Z0-9]*?(?=\?) |
リンクIDも同じ要領で、 &linkId= の後方、続く & の前までなので正規表現は、
1 |
(?<=\&linkId\=)[a-z0-9]*?(?=\&) |
これで必要な情報の処理は、全て実現できることが分かりました。
完成したPythonスクリプト
こうして完成したPythonスクリプトは、以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#!/usr/bin/env python # -*- coding: utf-8 -*- # AMAZON ASSOCIATE PIC-LINK GENERATOR import sys, requests, re # PARAMETER VALIDITY CHECK if (len(sys.argv) != 2): print('[ERROR] Usage: python %s <shortlink>') quit() else: s = sys.argv[1] if re.match('^https\:\/\/amzn.to\/', s) is None: print('[ERROR] invalid short link attached, aborting..') quit() else: shortlink = sys.argv[1] ## GET FULL URI STRING FROM SHORT LINK res = requests.head(shortlink) if res: txtlink = res.headers['Location'] if txtlink is None: print("[ERROR] no valid full uri string in response header, aborting..") quit() else: print("[ERROR] cannot get valid response from short link, aborting..") quit() ## GET ASIN: asin = re.search('(?<=\/dp\/)[A-Z0-9]*?(?=\?)', txtlink).group() if asin: print("ASIN: " + asin) else: print("[ERROR] no valid ASIN collected, aborting..") quit() ## GET LINKID: linkid = re.search('(?<=\&linkId\=)[a-z0-9]*?(?=\&)', txtlink).group() if linkid: print("LinkId: " + linkid) else: print("[ERROR] no valid LinkId collected, aborting..") quit() ## GEN. IFRAME # tracking id / associate id tid = '##YOURTRACKINGID##' iframehead = '<iframe sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&t=' iframetail = '"></iframe>' iframestr = iframehead + tid + '&asins=' + asin + '&linkId=' + linkid + iframetail print(iframestr) |
使用前に、変数 tid へ各自のトラッキングIDを入れてください(47行目)。
Pythonの標準モジュールしか使用していないので、Pythonのバージョンを問わず普遍的に動作するはず。Python2、Python3での実行結果は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
~$ python2 --version Python 2.7.17 ~$ python2 ./AmAff_genPicLink.py https://amzn.to/48zfiCz ASIN: B08PBNCJWJ LinkId: 447f2018ada219d569139fbec4d6b096 <iframe sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&t=servercan-22&asins=B08PBNCJWJ&linkId=447f2018ada219d569139fbec4d6b096"></iframe> ~$ python3 --version Python 3.8.0 ~$ python3 ./AmAff_genPicLink.py https://amzn.to/48zfiCz ASIN: B08PBNCJWJ LinkId: 447f2018ada219d569139fbec4d6b096 <iframe sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&t=servercan-22&asins=B08PBNCJWJ&linkId=447f2018ada219d569139fbec4d6b096"></iframe> |
一部消息では、こうした既存の画像リンクも表示されなくなる旨、Amazonから告知メールが送付されたとも言われていますが、私のところには届いていません。
とは言え、一連の動向からAmazonは画像リンクを廃したいのでは、とも邪推されるので、いずれはWordPressプラグインを使ったリンク作成(Rinkerなど)も考慮したいと思います。
PS)
本記事公開早々、もう既存の画像リンク全抹殺の号令が掛かったようです。リダイレクト先のネームレコードが無くなり、名前解決不能の状態にあるので、速やかにプラグイン導入へ動きます。
それまでの時間稼ぎとして、既存の画像リンクを非表示にするスクリプトを次の記事で組みました。