// ==UserScript==
// @name sasurugaya
// @namespace http://tampermonkey.net/
// @version 0.2
// @description record the surugaya item you buy
// @author longzai
// @match https://www.suruga-ya.jp/search*
// @match https://www.suruga-ya.jp/pcmypage/action_sell_search/detail*
// @match https://www.suruga-ya.jp/product/detail/*
// @match https://www.suruga-ya.jp/feature/timesale/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=suruga-ya.jp
// @grant unsafeWindow
// @grant GM_xmlhttpRequest
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_deleteValue
// @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js
// @connect *
// @license MIT
// ==/UserScript==
(function() {
'use strict';
unsafeWindow.GM_getValue=GM_getValue;
unsafeWindow.GM_setValue=GM_setValue;
var bought_items=GM_getValue('bought_items',{});
//var bought_items2=new Set()
var bought_items2=new Set(GM_getValue('bought_items2',[]));
var bought_pages=GM_getValue('bought_pages',{});
var tenpo_branch=GM_getValue('tenpo_branch',{'':'0001'});
var item_data=GM_getValue('item_data',{});
unsafeWindow.bought_items=bought_items;
unsafeWindow.bought_items2=bought_items2;
unsafeWindow.item_data=item_data;
console.log(tenpo_branch);
let div_item=$("div.item_box div.item");
console.log(Object.keys(bought_items).length,bought_items2.size);
console.log(div_item.length);
let all_a_tag=$("a");
all_a_tag.each((n,item)=>{
//console.log(item,n);
let h=item.getAttribute('href')
if(h && h.includes('search_word=&')){
item.setAttribute('href',h.replace('search_word=&','search_word=%E3%83%9E%E3%83%AA%E3%82%A2%E6%A7%98%E3%81%8C%E3%81%BF%E3%81%A6%E3%82%8B&'))
}
})
$("div.search_option").append(`<button onclick="{
var lnk = document.createElement ('input');
lnk.type='file';
lnk.dispatchEvent (new MouseEvent ('click'));
lnk.addEventListener('change',function(){
var reader=new FileReader();
reader.readAsText(lnk.files[0],'UTF-8')
reader.onload=function(e){var item_list=JSON.parse(e.target.result);
bought_items2=new Set()
for(var item of item_list){bought_items2.add(item);}
GM_setValue('bought_items2',Array.from(bought_items2));
console.log(bought_items2.size);}
}
)
}" >上传文件修改bought_items2(是否购买) </button>`);
$("div.search_option").append(`<button onclick="{
var lnk = document.createElement ('input');
lnk.type='file';
lnk.dispatchEvent (new MouseEvent ('click'));
lnk.addEventListener('change',function(){
var reader=new FileReader();
reader.readAsText(lnk.files[0],'UTF-8')
reader.onload=function(e){var json_data=JSON.parse(e.target.result);
item_data={}
for(var key in json_data){item_data[key]=json_data[key]['date_price'];}
GM_setValue('item_data',item_data);
}
}
)
}">上传文件修改item_data(爬虫文件,价格) </button>`);
$("div.search_option").append(`<button onclick="
{
var lnk = document.createElement ('input');
lnk.type='file';
lnk.dispatchEvent (new MouseEvent ('click'));
lnk.addEventListener('change',function(){
var reader=new FileReader();
reader.readAsText(lnk.files[0],'UTF-8')
reader.onload=function(e){var json_data=JSON.parse(e.target.result);
bought_items=json_data['bought_items'];
GM_setValue('bought_items',bought_items);
bought_items2=Array.from(json_data['bought_items2']);
GM_setValue('bought_items2',json_data['bought_items2']);
item_data=json_data['item_data'];
GM_setValue('item_data',item_data);
}
}
)
}">一次三个(bought_item,bought_items2,item_data) </button>`);
/*
const blob = new Blob([JSON.stringify({'bought_items':bought_items,'bought_items2':Array.from(bought_items2),'item_data':item_data}, null, 2)], { type: 'application/json' });
// 创建一个链接,指向这个Blob对象
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'a.json';
a.click();
// 释放URL对象
URL.revokeObjectURL(url);
*/
div_item.append((n)=>{var a=div_item[n].querySelector('div.title a');
var u=new URL(a.href);
var price_text='';
var b=u.pathname.split('/').pop();
console.log(b);
if (b in bought_items){price_text+=`<div style="color:red;">surugaya_bought_value:${bought_items[b]}</div> `}
if (bought_items2.has(b)){price_text+=`<div style="color:green;">outside_bought_value</div> `}
if (b in item_data){
for(var date in item_data[b]){
price_text+=`<div style="color:blue;"> ${date}</div>`;
var date_value=item_data[b][date]
for(var key in date_value){
price_text+=`<div style="color:black;">${key}:${date_value[key]}</div>`;
}
}
}
if(a.href.includes('/product-other/')){return price_text;
}
else if(a.href.includes('/product/other/')){return price_text;
}
else if (! a.href.includes('/product/detail/')){throw(a.href)}
var tenpo_cd=u.searchParams.get('tenpo_cd') || "";
//console.log(`<input type="checkbox" ${((b in bought_items) || bought_items2.has(b))?"":"checked"} class="addcartcheck" value1="${a.text}" value2="${a.href}" value3="${b}" tenpo_cd="${tenpo_cd}">`+price_text);
return `<input type="checkbox" ${((b in bought_items) || bought_items2.has(b))?"":"checked"} class="addcartcheck" value1="${a.text}" value2="${a.href}" value3="${b}" tenpo_cd="${tenpo_cd}">`+price_text;
}
);
let addcartcheck=$(".addcartcheck");
let trade_code=new URLSearchParams(window.location.search).get('trade_code');
//addcartcheck.each((n)=>{addcartcheck[n].checked=true;});
$('div.item div p a').on('click', function(event) {
if (event.shiftKey) {
event.preventDefault();
console.log($(this).attr('href'),$(this).attr('href').split('?')[0]);
window.open($(this).attr('href').split('?')[0], '_blank');
}
});
let x=$('table.mgnT15 tbody tr');
x.each((n)=>{if(n==0){return};var item1=x[n].children[0].textContent;x[n].children[0].innerHTML=`<a href="/product/detail/${item1}">${item1}</a>`});
if (window.location.pathname.includes('product/detail/')){
$("h1.h1_title_product").append((n)=>{
var price_text='';
var b=window.location.pathname.split('/').pop();
if (b in bought_items){price_text+=`<div style="color:red;">surugaya_bought_value:${bought_items[b]}</div> `}
if (bought_items2.has(b)){price_text+=`<div style="color:green;">outside_bought_value</div> `}
if (b in item_data){
for(var date in item_data[b]){
price_text+=`<div style="color:blue;"> ${date}</div>`;
var date_value=item_data[b][date]
for(var key in date_value){
price_text+=`<div style="color:black;">${key}:${date_value[key]}</div>`;
}
}
}
return price_text;
}
)
}
async function kd(e){//q:添加到购物车,y:从购买页保存数据修改bought_items,i:从商品详情页设置branch_num,z:上传文件修改bought_items2(是否购买),x:取消全部选中,b:清除bought_items和bought_items2,m:上传文件修改item_data(爬虫文件,价格)
let keycode=(window.event) ? e.which : e.keyCode;
//console.log(keycode,String.fromCharCode(keycode).toLowerCase(),String.fromCharCode(keycode))
if (e.ctrlKey && String.fromCharCode(keycode).toLowerCase()=='q')
{
var a1=0,a2=[],a3=[],a4=[];
var p=[]
addcartcheck.each((n)=>{
var e=addcartcheck[n];
console.log(`rem=${e.getAttribute("value3")}&tenpo_cd=${e.getAttribute("tenpo_cd")}&amount=1`);
let tenpo_cd=e.getAttribute("tenpo_cd");
if(! (tenpo_cd in tenpo_branch)){
a2.push(['未添加店铺',e.getAttribute("tenpo_cd"),e.getAttribute("value3")]);
return;
}
if (e.checked){
p.push( new Promise((resolve, reject) => {GM_xmlhttpRequest({
method: "POST",
url: "https://www.suruga-ya.jp/cargo/ajax_add",
data: `rem=${e.getAttribute("value3")}&branch_number=${tenpo_branch[tenpo_cd]}&tenpo_cd=${tenpo_cd}&amount=1`,
headers: { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8","X-Requested-With":"XMLHttpRequest"},
onload: function (response) {
var s=JSON.parse(response.responseText);
if(s.status=='1') {a1+=1;e.checked=false;}
else{a2.push([e.getAttribute("value1"),e.getAttribute("value2"),s.data]);}
resolve();
},
onerror: function (){
a3.push([e.getAttribute("value1"),e.getAttribute("value2")]);
resolve();
}
})
}
)
);
}
else{
a4.push([e.getAttribute("value1"),e.getAttribute("value2")]);
}
}
)
await Promise.all(p);
console.log(`未选中${a4.length}个商品,选中${a1+a2.length+a3.length}个商品,其中成功添加${a1}个,添加失败${a2.length}个,未成功处理${a3.length}个`)
console.log("添加失败的有:")
a2.forEach((value)=>{console.log(value);});
console.log("未成功处理的有:")
a3.forEach((value)=>{console.log(value);});
console.log("未选中的有:")
a4.forEach((value)=>{console.log(value);});
}
else if (e.ctrlKey && String.fromCharCode(keycode).toLowerCase()=='y')
{
if(trade_code){bought_pages[trade_code]='y'};
let x=$('table.mgnT15 tbody tr');
if(x[0].children[0].textContent!='品番' || x[0].children[5].textContent!='数量' || x[0].children[8].textContent!='備考'){throw(x[0])}
console.log(x.length-1,Object.keys(bought_items).length);
var count1=0
var count2=0
var count3=0
var count4=0
var count5=0
var p=[]
x.each((n)=>{if(n==0) {return};
if(x[n].children.length!=9){return}
var item1=x[n].children[0].textContent;
p.push( new Promise((resolve, reject) => {GM_xmlhttpRequest({
method: "GET",
url: "https://www.suruga-ya.jp/product/detail/"+item1,
onload: function (response) {
var item=response.finalUrl
if(item1!=item && item1 in bought_items){delete bought_items[item]}
var u=new URL(response.finalUrl);
item=u.pathname.split('/').pop();
if(item1!=item && item1 in bought_items){delete bought_items[item1]}
if(x[n].children[5].textContent==0)
{
count1+=1
if(x[n].children[8].textContent.includes('キャンセル') || x[n].children[8].textContent.includes('在庫なし'))
{
count2+=1
if (item in bought_items && bought_items[item]!=null){count3+=1;delete bought_items[item]}
}
else{
throw(x[n],x[n].children[8].textContent);
}
}
else{
count4+=1
if (!(item in bought_items)){count5+=1;bought_items[item]=x[n].children[4].textContent}
}
resolve();
},
onerror: function (){
console.log("reject: ",item1)
reject();
}
})
}
)
);
}
);
await Promise.all(p);
console.log(count1,count2,count3,count4,count5)
console.log(Object.keys(bought_items).length);
GM_setValue('bought_items',bought_items);
console.log(bought_items)
}
else if (e.ctrlKey && String.fromCharCode(keycode).toLowerCase()=='i'){
if(window.location.pathname.includes('/product/detail/')){
let tenpo_cd=$('input[name="tenpo_cd"]').attr('value');
let branch_num=$('input[name="branch_number"]').attr('value');
tenpo_branch[tenpo_cd]=branch_num;
console.log(tenpo_branch);
GM_setValue('tenpo_branch',tenpo_branch);
}
}
/*
else if (e.ctrlKey && String.fromCharCode(keycode).toLowerCase()=='z')
{
console.log('awegfaw');
var lnk = document.createElement ('input');
lnk.type="file"
lnk.dispatchEvent (new MouseEvent ("click"));
lnk.addEventListener('change',function(){
console.log(lnk.files[0].name)
var reader=new FileReader()
reader.readAsText(lnk.files[0],'UTF-8')
reader.onload=function(e){var item_list=JSON.parse(e.target.result);
bought_items2=new Set()
for(var item of item_list){bought_items2.add(item);}
GM_setValue('bought_items2',Array.from(bought_items2));
console.log(bought_items2.size);}
}
)
}
*/
else if (e.ctrlKey && String.fromCharCode(keycode).toLowerCase()=='x')
{
addcartcheck.each((n)=>{addcartcheck[n].checked=false;})
}
else if (e.ctrlKey && String.fromCharCode(keycode).toLowerCase()=='b')
{
bought_items={};
GM_setValue('bought_items',bought_items);
bought_items2=new Set();
GM_setValue('bought_items2',Array.from(bought_items2));
console.log('clear success');
}
/*
else if (e.ctrlKey && String.fromCharCode(keycode).toLowerCase()=='m')
{
console.log('awegfaw');
var lnk = document.createElement ('input');
lnk.type="file"
lnk.dispatchEvent (new MouseEvent ("click"));
lnk.addEventListener('change',function(){
console.log(lnk.files[0].name)
var reader=new FileReader()
reader.readAsText(lnk.files[0],'UTF-8')
reader.onload=function(e){var json_data=JSON.parse(e.target.result);
item_data={}
for(var key in json_data){item_data[key]=json_data[key]['date_price'];}
GM_setValue('item_data',item_data);
}
}
)
}
*/
else if (e.ctrlKey && String.fromCharCode(keycode).toLowerCase()=='¿')
{
alert("ctrl+q:添加到购物车,y:从购买页保存数据修改bought_items,i:从商品详情页设置branch_num,z:上传文件修改bought_items2(是否购买),x:取消全部选中,b:清除bought_items和bought_items2,m:上传文件修改item_data(爬虫文件,价格)");
}
}
document.addEventListener("keydown", kd);
console.log("abc");
})();