2020/01/11
Ringfit Adventure arrival bot has been frozen, so it has been renewed. We look forward to your continued support of Price arrival dolphin @ Ring Fit Adventure.
Notify when Ring Fit Adventure arrives at Amazon at a fixed price Ringfit Adventure arrival bot I made. I will introduce the back side of this bot. Eradicate resellers.
Ring Fit Adventure is very popular. It has been in short supply since it was released. This shortage is due to bulk purchases aimed at resale by resellers. In fact, there are hundreds of resales on Amazon at a price (about 12000 yen) that greatly exceeds the list price (8778 yen).
In order to buy at a fixed price without losing to resellers, it is necessary to pop in as soon as possible after arrival. Therefore, I decided to create a function to notify the arrival of ring fits at a fixed price. First of all, I made it for the purpose of getting a ring fit.
On the other hand, I also thought that by exposing this function, it would be possible to eradicate resellers. It is difficult to eliminate the existence of resellers. But with this feature, you can overcome the situation where you have to buy from a reseller. By providing a place where general purchasers can fight on the same level as resellers, we thought that it would be unnecessary to buy from resellers, and as a result, it would lead to eradication of resellers.
Santa Claus who want to give a ring fit as a Christmas present. Children who want to hold a New Year's gift and buy a ring fit. I fight with the power of IT.
Eradicate resellers.
--I buy Ring Fit Adventure --Providing opportunities for Santa Claus and children to buy Ring Fit Adventure --Eradicate resellers
I will explain the system configuration to eradicate resellers.
The bot program runs on AWS EC2. EC2 has a python script and a crontab configuration file deployed.
I will explain the flow to eradicate resellers.
Introducing the source code to eradicate resellers.
python & selenium & chrome
amazon.py
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import json
import urllib.request
import datetime
import pytz
#URL of the Ringfit product page
url = 'https://www.amazon.co.jp/%E4%BB%BB%E5%A4%A9%E5%A0%82-%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%95%E3%82%A3%E3%83%83%E3%83%88-%E3%82%A2%E3%83%89%E3%83%99%E3%83%B3%E3%83%81%E3%83%A3%E3%83%BC-Switch/dp/B07XV8VSZT/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%95%E3%82%A3%E3%83%83%E3%83%88&qid=1575977457&sr=8-1'
#Launch chrome from selenium and access the ring fit product page
options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
driver.get(url)
#Function to tweet
def tweet(message):
#twitter account
account = 'ringfit_hoshii'
password = 'hogehoge'
#Start selenium
options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
driver.set_window_size(height=877, width=1440)
#Open login page
driver.get('https://twitter.com/login/')
time.sleep(3) #Stop working
#Enter account
element_account = driver.find_element_by_class_name("js-username-field")
element_account.send_keys(account)
#Enter password
element_pass = driver.find_element_by_class_name("js-password-field")
element_pass.send_keys(password)
#Click the login button
element_login = driver.find_element_by_xpath('//*[@id="page-container"]/div/div[1]/form/div[2]/button')
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
element_login.click()
#Tweet
time.sleep(3)
driver.find_element_by_xpath('//*[@id="react-root"]/div/div/div/main/div/div/div/div[1]/div/div[2]/div[2]/div[1]/div/div/div[2]/div[1]/div/div/div/div/div/div/div/div[1]/div[1]/div/div/div/div[2]/div/div/div/div').send_keys(message)
# time.sleep(1)
driver.find_element_by_xpath('//*[@id="react-root"]/div/div/div/main/div/div/div/div[1]/div/div[2]/div[2]/div[1]/div/div/div[2]/div[2]/div/div/div[2]/div[3]').click()
#Sleep to wait for the tweet to be sent
time.sleep(2)
driver.quit()
return
#Function to get price & price judgment from Amazon's ring fit product page
def get_price(xpath):
price1 = driver.find_element_by_xpath(xpath)
p1str = price1.text[1:]
p1int = int(p1str.replace(',',''))
now = datetime.datetime.now(pytz.timezone('Asia/Tokyo'))
message2 = "[In Stock] Ring Fit Adventure" + str(p1int) + "Sold in yen!" + " Amazon URL: " + url + " datetime: " + str(now)
#List price judgment
if p1int > 9000 or p1int < 5000:
return
tweet(message2)
return
#There are several xpath appearance patterns on the RingFit product page, so try to get the price for those patterns.
xpaths = [
'//*[@id="unqualifiedBuyBox"]/div/div[1]/span',
'//*[@id="priceblock_ourprice"]'
]
for xpath in xpaths:
get_price(xpath)
driver.quit()
For executing tweets on selenium, I referred to here. The element acquisition by xpath was done by the same method as here.
crontab
cron.conf
#The chrome driver referenced by selenium/home/ec2-user/Since it is in bin, add it to path
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-user/.local/bin:/home/ec2-user/bin
#Run python script every minute
* * * * * python3 /home/ec2-user/ringfit/amazon.py
Describes server settings and deployments to eradicate resellers.
#Download and install the required resources
sudo yum -y update
sudo yum -y install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
#Download the driver for the chrome version.
#Version confirmation command
# yum info google-chrome-stable
wget https://chromedriver.storage.googleapis.com/78.0.3904.105/chromedriver_linux64.zip
unzip chromedriver_linux64.zip -d bin/
sudo yum -y install python3
sudo pip3 install Selenium
sudo pip3 install pytz
sudo yum -y install ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts
Deploy ʻamazon.pyand
cron.conf(omitted). Let's say you deployed to
/ home / ec2-user / ringfit`.
#Deploy destination
deploy_dir="/home/ec2-user/ringfit"
#crontab settings (reset and then cron.conf is being read)
crontab -r
crontab -u ec2-user ${deploy_dir}/cron.conf
You will receive tweets like this every minute during arrival.
Q&A
Amazon Since it is played when accessed from the curl command or python, I started chrome with selenium and took the method of accessing with the same procedure as a general user.
twitter I got a twitter developer account, but for some reason I didn't have permission to create an app. When I went around, there was a description that I could register a phone number in my twitter account, but for some reason I could not register a phone number, ... Give up and launch chrome with selenium, the following is abbreviated.
That's right. However, I think that resellers have such a function on their own. The significance of this bot is to allow general buyers to stand on the same ground as resellers.
――Price acquisition from Amazon is really suitable xpath, so I would like to think of a more robust method. ――Since the cost of EC2 is high, I would like to move to Lambda etc. that can be operated within the free tier. --I want to use the twitter API properly.
――I want to make some income by making the link attached to the tweet an affiliate link. At least about AWS fee ... ――I thought I would go about 1000 followers in no time. I advertised on multiple accounts and facebook. I searched for "Ringfit not for sale" and "I want a ringfit" and opened it with manual likes every day. As a result, it does not increase. I don't go 50. It doesn't increase at all. why? If you can buy a ring fit, you will be unfollowed because the bot is already obsolete. The annoyance of the once-minute notification is boosting. On the flip side, I'm happy that users are buying Ringfits properly, but I'm far from the goal of providing this feature to many people and eradicating resellers. ――In order to increase followers, we also considered announcements of products other than ring fit, but for example, just because you want ring fit does not mean that you want AirPods, and I think that announcements of products that you are not interested in will only be noise. I did.
Until the end Thank you for reading. It was my first Qiita post. I will continue to write articles (a little more seriously), so I look forward to working with you.
If you haven't got Ring Fit Adventure yet, please use it if you like ↓ Ringfit Adventure arrival bot
Ring Fit Adventure that I could buy at a fixed price ↓
Voice of gratitude ↓