First Commmit
This commit is contained in:
commit
81cbc09238
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
.DS_Store
|
||||||
|
.idea/*
|
||||||
|
*/.idea/*
|
||||||
|
*/__pycache__/*
|
||||||
268
TheChanges/dohl.py
Normal file
268
TheChanges/dohl.py
Normal file
@ -0,0 +1,268 @@
|
|||||||
|
import random,re
|
||||||
|
|
||||||
|
class 주역점치기:
|
||||||
|
def __init__(self):
|
||||||
|
self.sangaji = 50
|
||||||
|
self.taegeuk = 1
|
||||||
|
self.hyores = self.doit()
|
||||||
|
self.byunhyo = self.checkbyunhyo()
|
||||||
|
self.detail = self.interprete()
|
||||||
|
|
||||||
|
def 괘명(self,value):
|
||||||
|
db = [{'name': '중천건(乾)', '上卦': '乾(天),☰', '下卦': '乾(天),☰', 'value': ['初九', '九二', '九三', '九四', '九五', '上九']},
|
||||||
|
{'name': '택천쾌(夬)', '上卦': '兌(澤),☱', '下卦': '乾(天),☰', 'value': ['初九', '九二', '九三', '九四', '九五', '上六']},
|
||||||
|
{'name': '화천대유(大有)', '上卦': '離(火),☲', '下卦': '乾(天),☰', 'value': ['初九', '九二', '九三', '九四', '六五', '上九']},
|
||||||
|
{'name': '뢰천대장(大壯)', '上卦': '震(雷),☳', '下卦': '乾(天),☰', 'value': ['初九', '九二', '九三', '九四', '六五', '上六']},
|
||||||
|
{'name': '풍천소축(小畜)', '上卦': '巽(風),☴', '下卦': '乾(天),☰', 'value': ['初九', '九二', '九三', '六四', '九五', '上九']},
|
||||||
|
{'name': '수천수(需)', '上卦': '坎(水),☵', '下卦': '乾(天),☰', 'value': ['初九', '九二', '九三', '六四', '九五', '上六']},
|
||||||
|
{'name': '산천대축(大畜)', '上卦': '艮(山),☶', '下卦': '乾(天),☰', 'value': ['初九', '九二', '九三', '六四', '六五', '上九']},
|
||||||
|
{'name': '지천대(泰)', '上卦': '坤(地),☷', '下卦': '乾(天),☰', 'value': ['初九', '九二', '九三', '六四', '六五', '上六']},
|
||||||
|
{'name': '천택리(履)', '上卦': '乾(天),☰', '下卦': '兌(澤),☱', 'value': ['初九', '九二', '六三', '九四', '九五', '上九']},
|
||||||
|
{'name': '중택태(兌)', '上卦': '兌(澤),☱', '下卦': '兌(澤),☱', 'value': ['初九', '九二', '六三', '九四', '九五', '上六']},
|
||||||
|
{'name': '화택규(睽)', '上卦': '離(火),☲', '下卦': '兌(澤),☱', 'value': ['初九', '九二', '六三', '九四', '六五', '上九']},
|
||||||
|
{'name': '뢰택귀매(歸妹)', '上卦': '震(雷),☳', '下卦': '兌(澤),☱', 'value': ['初九', '九二', '六三', '九四', '六五', '上六']},
|
||||||
|
{'name': '풍택중부(中孚)', '上卦': '巽(風),☴', '下卦': '兌(澤),☱', 'value': ['初九', '九二', '六三', '六四', '九五', '上九']},
|
||||||
|
{'name': '수택절(節)', '上卦': '坎(水),☵', '下卦': '兌(澤),☱', 'value': ['初九', '九二', '六三', '六四', '九五', '上六']},
|
||||||
|
{'name': '산택손(損)', '上卦': '艮(山),☶', '下卦': '兌(澤),☱', 'value': ['初九', '九二', '六三', '六四', '六五', '上九']},
|
||||||
|
{'name': '지택림(臨)', '上卦': '坤(地),☷', '下卦': '兌(澤),☱', 'value': ['初九', '九二', '六三', '六四', '六五', '上六']},
|
||||||
|
{'name': '천화동인(同人)', '上卦': '乾(天),☰', '下卦': '離(火),☲', 'value': ['初九', '六二', '九三', '九四', '九五', '上九']},
|
||||||
|
{'name': '택화혁(革)', '上卦': '兌(澤),☱', '下卦': '離(火),☲', 'value': ['初九', '六二', '九三', '九四', '九五', '上六']},
|
||||||
|
{'name': '중화리(離)', '上卦': '離(火),☲', '下卦': '離(火),☲', 'value': ['初九', '六二', '九三', '九四', '六五', '上九']},
|
||||||
|
{'name': '뢰화풍(豊)', '上卦': '震(雷),☳', '下卦': '離(火),☲', 'value': ['初九', '六二', '九三', '九四', '六五', '上六']},
|
||||||
|
{'name': '풍화가인(家人)', '上卦': '巽(風),☴', '下卦': '離(火),☲', 'value': ['初九', '六二', '九三', '六四', '九五', '上九']},
|
||||||
|
{'name': '수화기제(旣濟)', '上卦': '坎(水),☵', '下卦': '離(火),☲', 'value': ['初九', '六二', '九三', '六四', '九五', '上六']},
|
||||||
|
{'name': '산화비(賁)', '上卦': '艮(山),☶', '下卦': '離(火),☲', 'value': ['初九', '六二', '九三', '六四', '六五', '上九']},
|
||||||
|
{'name': '지화명이(明夷)', '上卦': '坤(地),☷', '下卦': '離(火),☲', 'value': ['初九', '六二', '九三', '六四', '六五', '上六']},
|
||||||
|
{'name': '천뢰무방(无妄)', '上卦': '乾(天),☰', '下卦': '震(雷),☳', 'value': ['初九', '六二', '六三', '九四', '九五', '上九']},
|
||||||
|
{'name': '택뢰수(隨)', '上卦': '兌(澤),☱', '下卦': '震(雷),☳', 'value': ['初九', '六二', '六三', '九四', '九五', '上六']},
|
||||||
|
{'name': '화뢰서합(噬嗑)', '上卦': '離(火),☲', '下卦': '震(雷),☳', 'value': ['初九', '六二', '六三', '九四', '六五', '上九']},
|
||||||
|
{'name': '중뢰진(震)', '上卦': '震(雷),☳', '下卦': '震(雷),☳', 'value': ['初九', '六二', '六三', '九四', '六五', '上六']},
|
||||||
|
{'name': '풍뢰익(益)', '上卦': '巽(風),☴', '下卦': '震(雷),☳', 'value': ['初九', '六二', '六三', '六四', '九五', '上九']},
|
||||||
|
{'name': '수뢰준(屯)', '上卦': '坎(水),☵', '下卦': '震(雷),☳', 'value': ['初九', '六二', '六三', '六四', '九五', '上六']},
|
||||||
|
{'name': '산뢰이(頤)', '上卦': '艮(山),☶', '下卦': '震(雷),☳', 'value': ['初九', '六二', '六三', '六四', '六五', '上九']},
|
||||||
|
{'name': '지뢰복(復)', '上卦': '坤(地),☷', '下卦': '震(雷),☳', 'value': ['初九', '六二', '六三', '六四', '六五', '上六']},
|
||||||
|
{'name': '천풍구(姤)', '上卦': '乾(天),☰', '下卦': '巽(風),☴', 'value': ['初六', '九二', '九三', '九四', '九五', '上九']},
|
||||||
|
{'name': '택풍대과(大過)', '上卦': '兌(澤),☱', '下卦': '巽(風),☴', 'value': ['初六', '九二', '九三', '九四', '九五', '上六']},
|
||||||
|
{'name': '화풍정(鼎)', '上卦': '離(火),☲', '下卦': '巽(風),☴', 'value': ['初六', '九二', '九三', '九四', '六五', '上九']},
|
||||||
|
{'name': '뢰풍항(恒)', '上卦': '震(雷),☳', '下卦': '巽(風),☴', 'value': ['初六', '九二', '九三', '九四', '六五', '上六']},
|
||||||
|
{'name': '중풍손(巽)', '上卦': '巽(風),☴', '下卦': '巽(風),☴', 'value': ['初六', '九二', '九三', '六四', '九五', '上九']},
|
||||||
|
{'name': '수풍정(井)', '上卦': '坎(水),☵', '下卦': '巽(風),☴', 'value': ['初六', '九二', '九三', '六四', '九五', '上六']},
|
||||||
|
{'name': '산풍고(蠱)', '上卦': '艮(山),☶', '下卦': '巽(風),☴', 'value': ['初六', '九二', '九三', '六四', '六五', '上九']},
|
||||||
|
{'name': '지풍승(升)', '上卦': '坤(地),☷', '下卦': '巽(風),☴', 'value': ['初六', '九二', '九三', '六四', '六五', '上六']},
|
||||||
|
{'name': '천수송(訟)', '上卦': '乾(天),☰', '下卦': '坎(水),☵', 'value': ['初六', '九二', '六三', '九四', '九五', '上九']},
|
||||||
|
{'name': '택수곤(困)', '上卦': '兌(澤),☱', '下卦': '坎(水),☵', 'value': ['初六', '九二', '六三', '九四', '九五', '上六']},
|
||||||
|
{'name': '화수미제(未濟)', '上卦': '離(火),☲', '下卦': '坎(水),☵', 'value': ['初六', '九二', '六三', '九四', '六五', '上九']},
|
||||||
|
{'name': '뢰수해(解)', '上卦': '震(雷),☳', '下卦': '坎(水),☵', 'value': ['初六', '九二', '六三', '九四', '六五', '上六']},
|
||||||
|
{'name': '풍수환(渙)', '上卦': '巽(風),☴', '下卦': '坎(水),☵', 'value': ['初六', '九二', '六三', '六四', '九五', '上九']},
|
||||||
|
{'name': '중수감(坎)', '上卦': '坎(水),☵', '下卦': '坎(水),☵', 'value': ['初六', '九二', '六三', '六四', '九五', '上六']},
|
||||||
|
{'name': '산수몽(蒙)', '上卦': '艮(山),☶', '下卦': '坎(水),☵', 'value': ['初六', '九二', '六三', '六四', '六五', '上九']},
|
||||||
|
{'name': '지수사(師)', '上卦': '坤(地),☷', '下卦': '坎(水),☵', 'value': ['初六', '九二', '六三', '六四', '六五', '上六']},
|
||||||
|
{'name': '천산둔(遯)', '上卦': '乾(天),☰', '下卦': '艮(山),☶', 'value': ['初六', '六二', '九三', '九四', '九五', '上九']},
|
||||||
|
{'name': '택산함(咸)', '上卦': '兌(澤),☱', '下卦': '艮(山),☶', 'value': ['初六', '六二', '九三', '九四', '九五', '上六']},
|
||||||
|
{'name': '화산려(旅)', '上卦': '離(火),☲', '下卦': '艮(山),☶', 'value': ['初六', '六二', '九三', '九四', '六五', '上九']},
|
||||||
|
{'name': '뢰산소과(小過)', '上卦': '震(雷),☳', '下卦': '艮(山),☶', 'value': ['初六', '六二', '九三', '九四', '六五', '上六']},
|
||||||
|
{'name': '풍산점(漸)', '上卦': '巽(風),☴', '下卦': '艮(山),☶', 'value': ['初六', '六二', '九三', '六四', '九五', '上九']},
|
||||||
|
{'name': '수산건(蹇)', '上卦': '坎(水),☵', '下卦': '艮(山),☶', 'value': ['初六', '六二', '九三', '六四', '九五', '上六']},
|
||||||
|
{'name': '중산간(艮)', '上卦': '艮(山),☶', '下卦': '艮(山),☶', 'value': ['初六', '六二', '九三', '六四', '六五', '上九']},
|
||||||
|
{'name': '지산겸(謙)', '上卦': '坤(地),☷', '下卦': '艮(山),☶', 'value': ['初六', '六二', '九三', '六四', '六五', '上六']},
|
||||||
|
{'name': '천지비(否)', '上卦': '乾(天),☰', '下卦': '坤(地),☷', 'value': ['初六', '六二', '六三', '九四', '九五', '上九']},
|
||||||
|
{'name': '택지췌(萃)', '上卦': '兌(澤),☱', '下卦': '坤(地),☷', 'value': ['初六', '六二', '六三', '九四', '九五', '上六']},
|
||||||
|
{'name': '화지진(晉)', '上卦': '離(火),☲', '下卦': '坤(地),☷', 'value': ['初六', '六二', '六三', '九四', '六五', '上九']},
|
||||||
|
{'name': '뢰지예(豫)', '上卦': '震(雷),☳', '下卦': '坤(地),☷', 'value': ['初六', '六二', '六三', '九四', '六五', '上六']},
|
||||||
|
{'name': '풍지관(觀)', '上卦': '巽(風),☴', '下卦': '坤(地),☷', 'value': ['初六', '六二', '六三', '六四', '九五', '上九']},
|
||||||
|
{'name': '수지비(比)', '上卦': '坎(水),☵', '下卦': '坤(地),☷', 'value': ['初六', '六二', '六三', '六四', '九五', '上六']},
|
||||||
|
{'name': '산지박(剝)', '上卦': '艮(山),☶', '下卦': '坤(地),☷', 'value': ['初六', '六二', '六三', '六四', '六五', '上九']},
|
||||||
|
{'name': '중지곤(坤)', '上卦': '坤(地),☷', '下卦': '坤(地),☷', 'value': ['初六', '六二', '六三', '六四', '六五', '上六']}
|
||||||
|
]
|
||||||
|
for i in range(len(db)):
|
||||||
|
if value == db[i]['value']:
|
||||||
|
name = db[i]['name']
|
||||||
|
上卦 = db[i]['上卦']
|
||||||
|
下卦 = db[i]['下卦']
|
||||||
|
res = {'name': name, '下卦': 下卦, '上卦': 上卦}
|
||||||
|
return res
|
||||||
|
|
||||||
|
def explain(self):
|
||||||
|
res = self.detail
|
||||||
|
symbols = {'본괘':[],'지괘':[]}
|
||||||
|
guoiname = {}
|
||||||
|
for i in range(len(res)):
|
||||||
|
symbols['본괘'].append(res[i]['symbol'])
|
||||||
|
symbols['지괘'].append(res[i]['jigoui_symbol'])
|
||||||
|
guoiname['본괘'] = self.괘명(symbols['본괘'])
|
||||||
|
guoiname['지괘'] = self.괘명(symbols['지괘'])
|
||||||
|
if guoiname['본괘'] == guoiname['지괘']:
|
||||||
|
guoiname['지괘'] = ''
|
||||||
|
if self.byunhyo == 0:
|
||||||
|
guoiname['설명'] = guoiname['본괘']['name'] + "의 단사로 점의 답을 얻는다. 괘사뿐 아니라 단전, 대상을 모두 포함하여 판단한다."
|
||||||
|
if self.byunhyo == 1:
|
||||||
|
guoiname['설명'] = guoiname['본괘']['name'] + "의 변효의 효사를 해석한다."
|
||||||
|
if self.byunhyo == 2:
|
||||||
|
guoiname['설명'] = guoiname['본괘']['name'] + "의 두 변효의 효사를 해석한다. 위쪽 효사가 주동적 의미"
|
||||||
|
if self.byunhyo == 3:
|
||||||
|
guoiname['설명'] = guoiname['본괘']['name'] + "과 " + guoiname['지괘']['name'] + "의 괘사로 점을 판단한다."
|
||||||
|
if self.byunhyo == 4:
|
||||||
|
guoiname['본괘'] = ''
|
||||||
|
guoiname['설명'] = guoiname['지괘']['name'] + "의 불변효의 괘사로 판단한다. 아랫쪽이 주동한다."
|
||||||
|
if self.byunhyo == 5:
|
||||||
|
guoiname['본괘'] = ''
|
||||||
|
guoiname['설명'] = guoiname['지괘']['name'] + "의 불변호의 괘사로 판단한다."
|
||||||
|
if self.byunhyo == 6:
|
||||||
|
guoiname['본괘'] = ''
|
||||||
|
guoiname['설명'] = guoiname['지괘']['name'] + "의 단사로 판단한다. 건괘 곤괘의 경우는 용구, 용육의 효사를 따름"
|
||||||
|
return guoiname
|
||||||
|
|
||||||
|
def interprete(self):
|
||||||
|
res = self.hyores
|
||||||
|
if self.byunhyo == 0:
|
||||||
|
for i in range(len(res)):
|
||||||
|
res[i]['jigoui_shape'] = res[i]['shape']
|
||||||
|
res[i]['jigoui_symbol'] = res[i]['symbol']
|
||||||
|
res[i]['hyosaCheck'] = ""
|
||||||
|
if self.byunhyo == 1:
|
||||||
|
for i in range(len(res)):
|
||||||
|
res[i]['jigoui_shape'] = res[i]['shape']
|
||||||
|
res[i]['jigoui_symbol'] = res[i]['symbol']
|
||||||
|
if res[i]['number'] in [6, 9]:
|
||||||
|
res[i]['hyosaCheck'] = "主"
|
||||||
|
else:
|
||||||
|
res[i]['hyosaCheck'] = ""
|
||||||
|
if self.byunhyo == 2:
|
||||||
|
j = 0
|
||||||
|
for i in range(len(res)):
|
||||||
|
res[i]['jigoui_shape'] = res[i]['shape']
|
||||||
|
res[i]['jigoui_symbol'] = res[i]['symbol']
|
||||||
|
if res[i]['number'] in [6, 9]:
|
||||||
|
res[i]['hyosaCheck'] = "Y"
|
||||||
|
j = j + 1
|
||||||
|
if j == 2:
|
||||||
|
res[i]['hyosaCheck'] = "主"
|
||||||
|
else:
|
||||||
|
res[i]['hyosaCheck'] = ""
|
||||||
|
if self.byunhyo == 3:
|
||||||
|
for i in range(len(res)):
|
||||||
|
if res[i]['number'] == 6:
|
||||||
|
res[i]['jigoui_shape'] = 'xxxxxxx'
|
||||||
|
res[i]['jigoui_symbol'] = re.sub("六$","九",res[i]['symbol'])
|
||||||
|
elif res[i]['number'] == 9:
|
||||||
|
res[i]['jigoui_shape'] = 'ㅁㅁ ㅁㅁ'
|
||||||
|
res[i]['jigoui_symbol'] = re.sub("九$","六",res[i]['symbol'])
|
||||||
|
else:
|
||||||
|
res[i]['jigoui_shape'] = res[i]['shape']
|
||||||
|
res[i]['jigoui_symbol'] = res[i]['symbol']
|
||||||
|
res[i]['hyosaCheck'] = ""
|
||||||
|
if self.byunhyo == 4:
|
||||||
|
j = 0
|
||||||
|
for i in range(len(res)):
|
||||||
|
if res[i]['number'] == 6:
|
||||||
|
res[i]['jigoui_shape'] = 'xxxxxxx'
|
||||||
|
res[i]['jigoui_symbol'] = re.sub("六$","九",res[i]['symbol'])
|
||||||
|
res[i]['hyosaCheck'] = ""
|
||||||
|
elif res[i]['number'] == 9:
|
||||||
|
res[i]['jigoui_shape'] = 'ㅁㅁ ㅁㅁ'
|
||||||
|
res[i]['jigoui_symbol'] = re.sub("九$","六",res[i]['symbol'])
|
||||||
|
res[i]['hyosaCheck'] = ""
|
||||||
|
else:
|
||||||
|
res[i]['jigoui_shape'] = res[i]['shape']
|
||||||
|
res[i]['jigoui_symbol'] = res[i]['symbol']
|
||||||
|
res[i]['hyosaCheck'] = "Y"
|
||||||
|
j = j + 1
|
||||||
|
if j == 1 :
|
||||||
|
res[i]['hyosaCheck'] = "主"
|
||||||
|
if self.byunhyo == 5:
|
||||||
|
for i in range(len(res)):
|
||||||
|
if res[i]['number'] == 6:
|
||||||
|
res[i]['jigoui_shape'] = 'xxxxxxx'
|
||||||
|
res[i]['jigoui_symbol'] = re.sub("六$","九",res[i]['symbol'])
|
||||||
|
res[i]['hyosaCheck'] = ""
|
||||||
|
elif res[i]['number'] == 9:
|
||||||
|
res[i]['jigoui_shape'] = 'ㅁㅁ ㅁㅁ'
|
||||||
|
res[i]['jigoui_symbol'] = re.sub("九$","六",res[i]['symbol'])
|
||||||
|
res[i]['hyosaCheck'] = ""
|
||||||
|
else:
|
||||||
|
res[i]['jigoui_shape'] = res[i]['shape']
|
||||||
|
res[i]['jigoui_symbol'] = res[i]['symbol']
|
||||||
|
res[i]['hyosaCheck'] = "主"
|
||||||
|
if self.byunhyo == 6:
|
||||||
|
for i in range(len(res)):
|
||||||
|
if res[i]['number'] == 6:
|
||||||
|
res[i]['jigoui_shape'] = 'xxxxxxx'
|
||||||
|
res[i]['jigoui_symbol'] = re.sub("六$","九",res[i]['symbol'])
|
||||||
|
elif res[i]['number'] == 9:
|
||||||
|
res[i]['jigoui_shape'] = 'ㅁㅁ ㅁㅁ'
|
||||||
|
res[i]['jigoui_symbol'] = re.sub("九$","六",res[i]['symbol'])
|
||||||
|
else:
|
||||||
|
res[i]['jigoui_shape'] = res[i]['shape']
|
||||||
|
res[i]['jigoui_symbol'] = res[i]['symbol']
|
||||||
|
for i in range(len(res)):
|
||||||
|
chg = {'初六':'初六','上六':'上六','初九':'初九','上九':'上九','二六':'六二','二九':'九二','三六':'六三','三九':'九三','四六':'六四','四九':'九四','五六':'六五','五九':'九五'}
|
||||||
|
res[i]['symbol'] = chg[res[i]['symbol']]
|
||||||
|
res[i]['jigoui_symbol'] = chg[res[i]['jigoui_symbol']]
|
||||||
|
return res
|
||||||
|
|
||||||
|
def checkbyunhyo(self):
|
||||||
|
res = 0
|
||||||
|
for i in range(len(self.hyores)):
|
||||||
|
if self.hyores[i]['number'] in [6,9]:
|
||||||
|
res = res + 1
|
||||||
|
return res
|
||||||
|
|
||||||
|
def doit(self):
|
||||||
|
res = []
|
||||||
|
prefix = ['初', '二', '三', '四', '五', '上']
|
||||||
|
for i in range(6):
|
||||||
|
res.append(self.decidehyo())
|
||||||
|
res[i]['symbol'] = prefix[i] + res[i]['symbol']
|
||||||
|
return res
|
||||||
|
|
||||||
|
def decidehyo(self):
|
||||||
|
objList = self.sambyun()
|
||||||
|
#number = (49 - (r1 + r2 + r3))//4
|
||||||
|
db = [{'name':'소양','shape':'=======','number': 7,'symbol':'九','values': [[9, 4, 8], [9, 8, 4], [5, 8, 8]]},
|
||||||
|
{'name':'소음','shape':'=== ===','number': 8,'symbol':'六','values': [[5, 4, 8], [5, 8, 4], [9, 4, 4]]},
|
||||||
|
{'name':'노양','shape':'ㅁㅁㅁㅁㅁ','number': 9,'symbol':'九','values': [[5, 4, 4]]},
|
||||||
|
{'name':'노음','shape':'xxx xxx','number': 6,'symbol':'六','values': [[9, 8, 8]]}]
|
||||||
|
for i in range(len(db)):
|
||||||
|
for j in range(len(db[i]['values'])):
|
||||||
|
if objList == db[i]['values'][j]:
|
||||||
|
hyoname = db[i]['name']
|
||||||
|
shape = db[i]['shape']
|
||||||
|
number = db[i]['number']
|
||||||
|
symbol = db[i]['symbol']
|
||||||
|
res = {'name': hyoname, 'shape': shape, 'number': number, 'symbol':symbol, 'remains': objList}
|
||||||
|
return res
|
||||||
|
|
||||||
|
def sambyun(self):
|
||||||
|
hyo = self.sangaji - self.taegeuk
|
||||||
|
res = []
|
||||||
|
for i in range(3):
|
||||||
|
res.append(self.byun(hyo))
|
||||||
|
hyo = hyo - res[i]
|
||||||
|
return res
|
||||||
|
|
||||||
|
def byun(self,hyo):
|
||||||
|
tmp = random.randrange(1, 6)
|
||||||
|
randmin = (hyo // 2) - tmp
|
||||||
|
randmax = (hyo // 2) + tmp
|
||||||
|
left = random.randrange(randmin, randmax)
|
||||||
|
right = hyo - left
|
||||||
|
human = 1
|
||||||
|
right = right - human
|
||||||
|
left_tmp = left % 4
|
||||||
|
if left_tmp == 0:
|
||||||
|
left_tmp = 4
|
||||||
|
human = human + left_tmp
|
||||||
|
right_tmp = right % 4
|
||||||
|
if right_tmp == 0:
|
||||||
|
right_tmp = 4
|
||||||
|
human = human + right_tmp
|
||||||
|
return human
|
||||||
|
|
||||||
|
|
||||||
|
주역점치기 = 주역점치기()
|
||||||
|
if __name__ == '__main__':
|
||||||
|
res = 주역점치기.detail
|
||||||
|
for i in reversed(res):
|
||||||
|
print(i)
|
||||||
|
rres = 주역점치기.explain()
|
||||||
|
print(rres)
|
||||||
113
TheChanges/main.py
Normal file
113
TheChanges/main.py
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
import random
|
||||||
|
|
||||||
|
def byun(hyo):
|
||||||
|
randmin = (hyo//2) - 10
|
||||||
|
randmax = (hyo//2) + 10
|
||||||
|
left = random.randrange(randmin, randmax)
|
||||||
|
right = hyo - left
|
||||||
|
human = 1
|
||||||
|
right = right - human
|
||||||
|
left_tmp = left % 4
|
||||||
|
if left_tmp == 0:
|
||||||
|
left_tmp = 4
|
||||||
|
human = human + left_tmp
|
||||||
|
right_tmp = right % 4
|
||||||
|
if right_tmp == 0:
|
||||||
|
right_tmp = 4
|
||||||
|
human = human + right_tmp
|
||||||
|
return human
|
||||||
|
|
||||||
|
def decidehyo(r1,r2,r3):
|
||||||
|
objList = [r1, r2, r3]
|
||||||
|
number = (49 - (r1 + r2 + r3))//4
|
||||||
|
db = [{'name':'소양','values': [[9, 4, 8], [9, 8, 4], [5, 8, 8]]},
|
||||||
|
{'name':'소음','values': [[5, 4, 8], [5, 8, 4], [9, 4, 4]]},
|
||||||
|
{'name':'노양','values': [[5, 4, 4]]},
|
||||||
|
{'name':'노음','values': [[9, 8, 8]]}]
|
||||||
|
hyoname = ''
|
||||||
|
for i in range(len(db)):
|
||||||
|
for j in range(len(db[i]['values'])):
|
||||||
|
if objList == db[i]['values'][j]:
|
||||||
|
hyoname = db[i]['name']
|
||||||
|
shape = {'소양':'=======', '소음': '=== ===',
|
||||||
|
'노양': 'ㅁㅁㅁㅁㅁ', '노음': 'xxx xxx'}
|
||||||
|
res = {'name': hyoname, 'remains': objList, 'shape': shape[hyoname], 'number': number}
|
||||||
|
return res
|
||||||
|
|
||||||
|
def findbyunhyo(res):
|
||||||
|
tmp = 0
|
||||||
|
for i in range(len(res)):
|
||||||
|
tmp = tmp + res[i]['number']
|
||||||
|
no = 55 - tmp
|
||||||
|
byunhyo = [{'chhyo':0,'noar':[1,12,13]},
|
||||||
|
{'chhyo':1,'noar':[2,11,14]},
|
||||||
|
{'chhyo':2,'noar':[3,10,15]},
|
||||||
|
{'chhyo':3,'noar':[4,9,16]},
|
||||||
|
{'chhyo':4,'noar':[5,8,17]},
|
||||||
|
{'chhyo':5,'noar':[6,7,18,19]}]
|
||||||
|
for i in range(len(byunhyo)):
|
||||||
|
if no in byunhyo[i]['noar']:
|
||||||
|
chhyo = byunhyo[i]['chhyo']
|
||||||
|
return chhyo
|
||||||
|
|
||||||
|
def finalizeHyo(res,bynhyo):
|
||||||
|
numberlist = [res[0]['number'],res[1]['number'],res[2]['number'],res[3]['number'],res[4]['number'],res[5]['number']]
|
||||||
|
enablech = numberlist.count(6) + numberlist.count(9) #可變之爻
|
||||||
|
for i in range(len(res)):
|
||||||
|
if res[i]['number'] == 6:
|
||||||
|
res[i]['shape'] = '=== ==='
|
||||||
|
if res[i]['number'] == 9:
|
||||||
|
res[i]['shape'] = '======='
|
||||||
|
if enablech in [1, 2]:
|
||||||
|
if res[bynhyo]['number'] in [6,9]:
|
||||||
|
for i in range(len(res)):
|
||||||
|
if res[i]['number'] == 6:
|
||||||
|
res[i]['shape'] = '======='
|
||||||
|
if res[i]['number'] == 9:
|
||||||
|
res[i]['shape'] = '=== ==='
|
||||||
|
if enablech in [3, 4, 5]:
|
||||||
|
if res[bynhyo]['number'] in [6, 9]:
|
||||||
|
for i in range(len(res)):
|
||||||
|
if res[i]['number'] == 6:
|
||||||
|
res[i]['shape'] = '======='
|
||||||
|
if res[i]['number'] == 9:
|
||||||
|
res[i]['shape'] = '=== ==='
|
||||||
|
if enablech == 6:
|
||||||
|
for i in range(len(res)):
|
||||||
|
if res[i]['number'] == 6:
|
||||||
|
res[i]['shape'] = '======='
|
||||||
|
if res[i]['number'] == 9:
|
||||||
|
res[i]['shape'] = '=== ==='
|
||||||
|
return res
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
res = []
|
||||||
|
for i in range(6):
|
||||||
|
# 제1변
|
||||||
|
sangaji = 50
|
||||||
|
taegeuk = 1
|
||||||
|
hyo = sangaji - taegeuk
|
||||||
|
remains1 = byun(hyo)
|
||||||
|
#제2변
|
||||||
|
hyo = hyo - remains1
|
||||||
|
remains2 = byun(hyo)
|
||||||
|
#제3변
|
||||||
|
hyo = hyo - remains2
|
||||||
|
remains3 = byun(hyo)
|
||||||
|
res.append(decidehyo(remains1,remains2,remains3))
|
||||||
|
#res.reverse()
|
||||||
|
#for i in range(len(res)):
|
||||||
|
# print(res[i])
|
||||||
|
|
||||||
|
for i in reversed(res):
|
||||||
|
print(i)
|
||||||
|
|
||||||
|
byunhyo = findbyunhyo(res)
|
||||||
|
print('宜變之爻 : ' + str(byunhyo + 1))
|
||||||
|
|
||||||
|
rres = finalizeHyo(res, byunhyo)
|
||||||
|
for i in reversed(rres):
|
||||||
|
print(i)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
56
auto_sshfs_mount/main.py
Executable file
56
auto_sshfs_mount/main.py
Executable file
@ -0,0 +1,56 @@
|
|||||||
|
#!/usr/local/bin/python
|
||||||
|
import socket,os
|
||||||
|
|
||||||
|
def get_ip():
|
||||||
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
s.connect(("8.8.8.8", 80))
|
||||||
|
res = s.getsockname()[0]
|
||||||
|
return res
|
||||||
|
|
||||||
|
def check_mount(fpath):
|
||||||
|
check_mnt = os.path.ismount(fpath)
|
||||||
|
if check_mnt == True:
|
||||||
|
if fpath == '/Users/maddiekorea/BUNTUPAD':
|
||||||
|
destpath = fpath + "/data"
|
||||||
|
if fpath == '/Users/maddiekorea/IMAC':
|
||||||
|
destpath = fpath + "/Parallels"
|
||||||
|
check_dir = os.path.isdir(destpath)
|
||||||
|
if check_dir == True:
|
||||||
|
res = True
|
||||||
|
else:
|
||||||
|
res = False
|
||||||
|
else:
|
||||||
|
res = False
|
||||||
|
return res
|
||||||
|
|
||||||
|
def brew_backup():
|
||||||
|
cmd = "d=`date +%Y-%m-%d`; "
|
||||||
|
cmd = cmd + 'f="/Users/maddiekorea/BUNTUPAD/data/imac/macbookair_brew_list_"$d".txt"; '
|
||||||
|
cmd = cmd + '/opt/homebrew/bin/brew list > $f; /usr/bin/bzip2 -f $f;'
|
||||||
|
return cmd
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
ip = get_ip()
|
||||||
|
print(ip)
|
||||||
|
mount_points = [{'mount_point': '/Users/maddiekorea/BUNTUPAD',
|
||||||
|
'cmd': '/usr/local/bin/sshfs -o volname=BUNTUPAD,follow_symlinks,reconnect,ServerAliveInterval=15,ServerAliveCountMax=3,idmap=user,auto_xattr,dev,suid,defer_permissions,noappledouble,noapplexattr maddiekorea@192.168.0.10:/home/maddiekorea /Users/maddiekorea/BUNTUPAD',
|
||||||
|
'umount': '/usr/sbin/diskutil unmount /Users/maddiekorea/BUNTUPAD'},
|
||||||
|
{'mount_point': '/Users/maddiekorea/IMAC',
|
||||||
|
'cmd': '/usr/local/bin/sshfs -o volname=IMAC,follow_symlinks,reconnect,ServerAliveInterval=15,ServerAliveCountMax=3,idmap=user,auto_xattr,dev,suid,defer_permissions,noappledouble,noapplexattr maddiekorea@192.168.0.3:/Users/maddiekorea /Users/maddiekorea/IMAC',
|
||||||
|
'umount': '/usr/sbin/diskutil unmount /Users/maddiekorea/IMAC'}]
|
||||||
|
if ip == '192.168.0.77' :
|
||||||
|
for i in range(len(mount_points)):
|
||||||
|
if check_mount(mount_points[i]['mount_point']) == False:
|
||||||
|
os.system(mount_points[i]['umount'])
|
||||||
|
os.system(mount_points[i]['cmd'])
|
||||||
|
print(mount_points[i]['mount_point'] + " is Mounted.")
|
||||||
|
else:
|
||||||
|
print(mount_points[i]['mount_point'] + " is already Mounted.")
|
||||||
|
#os.system(brew_backup())
|
||||||
|
#print("brew list back-uped.")
|
||||||
|
else:
|
||||||
|
#print("You're not in Home.")
|
||||||
|
for i in range(len(mount_points)):
|
||||||
|
if check_mount(mount_points[i]['mount_point']) == True:
|
||||||
|
os.system(mount_points[i]['umount'])
|
||||||
|
print(mount_points[i]['cmd'] + " is unMounted.")
|
||||||
22
automations/main.py
Normal file
22
automations/main.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import pandas
|
||||||
|
from sendmail import *
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
df = pandas.read_excel("./스마트스토어_전체주문발주발송관리_20220915_0938.xls")
|
||||||
|
df_playauto = pandas.read_excel("./아트박스_주문파일취합_2202_0908.xlsx")
|
||||||
|
df_artbox = pandas.read_excel("./플레이오토_주문용파일취합_2022_0908.xlsx")
|
||||||
|
print(df)
|
||||||
|
print(df_playauto)
|
||||||
|
print(df_artbox)
|
||||||
|
|
||||||
|
to = 'maddiekorea@gmail.com'
|
||||||
|
title = "Test"
|
||||||
|
contents = """6...7"""
|
||||||
|
attachments = "/Users/maddiekorea/PycharmProjects/automations/플레이오토_주문취합_다운로드파일_필드전체적용_샘플.xlsx"
|
||||||
|
|
||||||
|
mail = sendmail(to, title, contents, attachments)
|
||||||
|
mail.smtprun()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
92
automations/makePrdDB.py
Normal file
92
automations/makePrdDB.py
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
import pandas, pymysql, json, re, os
|
||||||
|
|
||||||
|
def makejson(text):
|
||||||
|
textlist = text.split("\n")
|
||||||
|
return textlist
|
||||||
|
|
||||||
|
def escapestring(text):
|
||||||
|
res = re.sub(r"\'","\\'",text)
|
||||||
|
return res
|
||||||
|
|
||||||
|
def makeOptContent(optgroup,options):
|
||||||
|
optlist = options.split("\n")
|
||||||
|
optgrplist = optgroup.split("\n")
|
||||||
|
res = []
|
||||||
|
for i in range(len(optlist)):
|
||||||
|
valuelist = optlist[i].split(",")
|
||||||
|
optCont = {}
|
||||||
|
for j in range(len(optgrplist)):
|
||||||
|
optCont[optgrplist[j]] = re.sub(r"\'", "’", valuelist[j])
|
||||||
|
#optCont[optgrplist[j]] = valuelist[j]
|
||||||
|
res.append(optCont)
|
||||||
|
return res
|
||||||
|
|
||||||
|
def makeOPtPrice(price,optprice):
|
||||||
|
opp = optprice.split("\n")
|
||||||
|
res = []
|
||||||
|
for i in range(len(opp)):
|
||||||
|
_opp = int(opp[i]) + int(price)
|
||||||
|
res.append(_opp)
|
||||||
|
return res
|
||||||
|
|
||||||
|
def getXlsfiles():
|
||||||
|
fpath = "/Users/maddiekorea/Desktop/스마트스토어/"
|
||||||
|
xlslist = os.listdir(fpath)
|
||||||
|
xlslist.sort()
|
||||||
|
for i in range(len(xlslist)):
|
||||||
|
xlslist[i] = fpath + xlslist[i]
|
||||||
|
return xlslist
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
files = getXlsfiles()
|
||||||
|
for index in range(len(files)):
|
||||||
|
df = pandas.read_excel(files[index], header=1, skiprows=[2, 3, 4], usecols=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 18, 19, 20])
|
||||||
|
df = df.fillna("")
|
||||||
|
for row in df.iterrows():
|
||||||
|
try:
|
||||||
|
db = pymysql.connect(host='127.0.0.1', port=3306, user='maddiekorea', password='mad(#lin',
|
||||||
|
db='conteenew_catalogue', charset='utf8', unix_socket="/tmp/mysql.sock")
|
||||||
|
cursor = db.cursor()
|
||||||
|
dispSql = """INSERT INTO `conteenew_catalogue`.`dispPrds` VALUES (0,'{0}','','','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}')
|
||||||
|
""".format(row[1]['상품번호'], row[1]['카테고리코드'], row[1]['판매자 상품코드'], row[1]['브랜드'],
|
||||||
|
escapestring(row[1]['상품명']), row[1]['상품상태'], row[1]['판매가'], row[1]['부가세'],
|
||||||
|
row[1]['재고수량'], row[1]['옵션형태'], row[1]['대표이미지'],
|
||||||
|
json.dumps(makejson(row[1]['추가이미지']), ensure_ascii=False))
|
||||||
|
cursor.execute(dispSql)
|
||||||
|
db.commit()
|
||||||
|
db.close()
|
||||||
|
if row[1]['옵션형태'] == "조합형":
|
||||||
|
optcontent = makeOptContent(row[1]['옵션명'], row[1]['옵션값'])
|
||||||
|
optprice = makeOPtPrice(row[1]['판매가'], row[1]['옵션가'])
|
||||||
|
stock = makejson(row[1]['옵션 재고수량'])
|
||||||
|
for i in range(len(optcontent)):
|
||||||
|
try:
|
||||||
|
db = pymysql.connect(host='127.0.0.1', port=3306, user='maddiekorea', password='mad(#lin',
|
||||||
|
db='conteenew_catalogue', charset='utf8',
|
||||||
|
unix_socket="/tmp/mysql.sock")
|
||||||
|
cursor = db.cursor()
|
||||||
|
skuSql = """INSERT INTO `conteenew_catalogue`.`skuEntries` VALUES (0,'{0}','','','{1}','{2}','{3}','{4}','{5}','{6}')
|
||||||
|
""".format(row[1]['상품번호'], row[1]['판매자 상품코드'], row[1]['브랜드'],
|
||||||
|
escapestring(row[1]['상품명']), json.dumps(optcontent[i], ensure_ascii=False),
|
||||||
|
optprice[i], stock[i])
|
||||||
|
cursor.execute(skuSql)
|
||||||
|
db.commit()
|
||||||
|
db.close()
|
||||||
|
except:
|
||||||
|
print(skuSql)
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
db = pymysql.connect(host='127.0.0.1', port=3306, user='maddiekorea', password='mad(#lin',
|
||||||
|
db='conteenew_catalogue', charset='utf8', unix_socket="/tmp/mysql.sock")
|
||||||
|
cursor = db.cursor()
|
||||||
|
skuSql = """INSERT INTO `conteenew_catalogue`.`skuEntries` VALUES (0,'{0}','','','{1}','{2}','{3}','{4}','{5}','{6}')
|
||||||
|
""".format(row[1]['상품번호'], row[1]['판매자 상품코드'], row[1]['브랜드'], escapestring(row[1]['상품명']),
|
||||||
|
json.dumps({'원래없음': re.sub(r"\'", "’", row[1]['상품명'])}, ensure_ascii=False),
|
||||||
|
row[1]['판매가'], row[1]['재고수량'])
|
||||||
|
cursor.execute(skuSql)
|
||||||
|
db.commit()
|
||||||
|
db.close()
|
||||||
|
except:
|
||||||
|
print(skuSql)
|
||||||
|
except:
|
||||||
|
print(dispSql)
|
||||||
132
automations/mergeorders.py
Normal file
132
automations/mergeorders.py
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
import pandas, os, random
|
||||||
|
from datetime import date, timedelta, datetime
|
||||||
|
|
||||||
|
class mergeNewOrders:
|
||||||
|
def __init__(self):
|
||||||
|
self.queuedir = "/Users/maddiekorea/PycharmProjects/automations/new_orders"
|
||||||
|
self.queuefiles = self.getQueue()
|
||||||
|
self.currentfile = "/Users/maddiekorea/PycharmProjects/automations/now/current.xlsx"
|
||||||
|
self.proccessed = "/Users/maddiekorea/PycharmProjects/automations/proccessed"
|
||||||
|
self.objfiles = {'smartstore':self.getSmartStoreOrderfile(),'playauto':self.getPlayAutoOrderfile(),'artbox':self.getArtBoxOrderfile()}
|
||||||
|
self.resfileformat = ['상품주문번호','주문번호','배송방법','택배사','송장번호','발송일','구매자명','수취인명','주문상태','결제일','상품번호','상품명','옵션정보','수량','옵션가격','상품가격','상품별 할인액','판매자 부담 할인액','상품별 총 주문금액','발주확인일','발송기한','발송처리일','송장출력일','배송비 형태','배송비 묶음번호','배송비 유형','배송비 합계','제주/도서 추가배송비','배송비 할인액','판매자 상품코드','판매자 내부코드1','판매자 내부코드2','수취인연락처1','수취인연락처2','통합배송지','구매자연락처','우편번호','배송메세지','출고지','결제수단','수수료 과금구분','수수료결제방식','네이버페이 주문관리 수수료','매출연동 수수료','매출연동 수수료 구분','정산예정금액','개인통관고유부호','주문일시','마지막 유입경로','유입채널','원주문코드','원주문GR시퀀스','작가코드','SKU코드','쇼핑몰상품코드','공급사']
|
||||||
|
self.ordernumCount = 0
|
||||||
|
|
||||||
|
def getQueue(self):
|
||||||
|
xlsx_list = [file for file in os.listdir(self.queuedir) if file.endswith(r'.xlsx') or file.endswith(r'.xls')]
|
||||||
|
return xlsx_list
|
||||||
|
|
||||||
|
def getSmartStoreOrderfile(self):
|
||||||
|
smstorelist = [item for item in self.queuefiles if "스마트스토어" in item]
|
||||||
|
if len(smstorelist) != 1:
|
||||||
|
return ''
|
||||||
|
else:
|
||||||
|
return self.queuedir + "/" + smstorelist[0]
|
||||||
|
|
||||||
|
def getPlayAutoOrderfile(self):
|
||||||
|
plAutolist = [item for item in self.queuefiles if "플레이오토" in item]
|
||||||
|
if len(plAutolist) != 1:
|
||||||
|
return ''
|
||||||
|
else:
|
||||||
|
return self.queuedir + "/" + plAutolist[0]
|
||||||
|
|
||||||
|
def getArtBoxOrderfile(self):
|
||||||
|
artBoxlist = [item for item in self.queuefiles if "아트박스" in item]
|
||||||
|
if len(artBoxlist) != 1:
|
||||||
|
return ''
|
||||||
|
else:
|
||||||
|
return self.queuedir + "/" + artBoxlist[0]
|
||||||
|
|
||||||
|
def smartstorehandle(self):
|
||||||
|
file = self.objfiles['smartstore']
|
||||||
|
df = pandas.read_excel(file,header=1)
|
||||||
|
df['유입채널'] = "네이버"
|
||||||
|
df['원주문코드'] = df['주문번호']
|
||||||
|
df['원주문GR시퀀스'] = df['상품주문번호']
|
||||||
|
df['작가코드'] = df['판매자 상품코드']
|
||||||
|
df['SKU코드'] = ''
|
||||||
|
df['쇼핑몰상품코드'] = df['상품번호']
|
||||||
|
df['공급사'] = ''
|
||||||
|
df = df.astype({'상품주문번호':'str','주문번호':'str','상품번호':'str','배송비 묶음번호':'str','우편번호':'str','원주문코드':'str','원주문GR시퀀스':'str','쇼핑몰상품코드':'str'})
|
||||||
|
df['우편번호'] = df.apply(lambda x: x['우편번호'].zfill(5), axis=1)
|
||||||
|
return df
|
||||||
|
|
||||||
|
def playautohandle(self):
|
||||||
|
file = self.objfiles['playauto']
|
||||||
|
df = pandas.read_excel(file)
|
||||||
|
rdf = pandas.DataFrame(columns = self.resfileformat)
|
||||||
|
rdf['주문번호'] = df['묶음번호']
|
||||||
|
rdf['배송방법'] = '택배,등기,소포'
|
||||||
|
rdf['결제일'] = df['결제완료일']
|
||||||
|
df['유입채널'] = df.apply(lambda x: self.makeChannelname(x['쇼핑몰(계정)']), axis=1)
|
||||||
|
rdf['유입채널'] = df["유입채널"]
|
||||||
|
rdf['쇼핑몰상품코드'] = df['쇼핑몰 상품코드']
|
||||||
|
rdf['상품명'] = df['온라인 상품명']
|
||||||
|
rdf['옵션정보'] = df['옵션']
|
||||||
|
rdf['수량'] = df['주문수량']
|
||||||
|
df['_주문자명'] = df.apply(lambda x: self.makeChannelname(x['주문자(ID)']), axis=1)
|
||||||
|
rdf['구매자명'] = df['_주문자명']
|
||||||
|
rdf['수취인명'] = df['수령자명']
|
||||||
|
df = df.astype({'배송메세지':'str','기타메세지':'str'})
|
||||||
|
df['_배송메세지'] = df[['배송메세지', '기타메세지']].apply(' '.join, axis=1)
|
||||||
|
rdf['배송메세지'] = df['_배송메세지']
|
||||||
|
rdf['배송메세지'] = rdf.apply(lambda x: x['배송메세지'].replace("nan",""), axis=1)
|
||||||
|
df['우편번호'] = df.apply(lambda x: self.postcodeNormal(x['우편번호']), axis=1)
|
||||||
|
rdf['우편번호'] = df['우편번호']
|
||||||
|
rdf['통합배송지'] = df['주소']
|
||||||
|
rdf['상품별 총 주문금액'] = df['금액']
|
||||||
|
rdf['배송비 합계'] = df['배송비']
|
||||||
|
rdf['주문일시'] = df['주문일']
|
||||||
|
rdf['발송일'] = df['발송예정일']
|
||||||
|
rdf['송장번호'] = df['배송번호']
|
||||||
|
rdf['주문상태'] = df['주문상태']
|
||||||
|
rdf['배송비 유형'] = df['배송방법']
|
||||||
|
rdf['수취인연락처1'] = df['수령자 휴대폰번호']
|
||||||
|
rdf['구매자연락처'] = df['주문자 휴대폰번호']
|
||||||
|
rdf['출고지'] = df['배송처']
|
||||||
|
rdf['원주문GR시퀀스'] = df['쇼핑몰 주문번호']
|
||||||
|
rdf['원주문코드'] = rdf.apply(lambda x: self.getOrgOrdNum(x['원주문GR시퀀스']), axis=1)
|
||||||
|
rdf['상품주문번호'] = rdf.apply(lambda x: self.fakeOrderNo(), axis=1)
|
||||||
|
rdf = rdf.astype({'쇼핑몰상품코드': 'str','상품주문번호':'str','주문번호':'str'})
|
||||||
|
rdf['결제일'] = pandas.to_datetime(rdf['결제일'], format='%Y-%m-%d %H:%M:%S', errors='raise')
|
||||||
|
rdf['주문일시'] = pandas.to_datetime(rdf['주문일시'], format='%Y-%m-%d %H:%M:%S', errors='raise')
|
||||||
|
return rdf
|
||||||
|
|
||||||
|
def makeChannelname(self,chstring):
|
||||||
|
strs = chstring.split('/')
|
||||||
|
res = strs[0]
|
||||||
|
return res
|
||||||
|
|
||||||
|
def postcodeNormal(self,postcodes):
|
||||||
|
res = str(postcodes).replace("-","")
|
||||||
|
return res
|
||||||
|
|
||||||
|
def merge(self):
|
||||||
|
df = self.smartstorehandle()
|
||||||
|
df2 = self.playautohandle()
|
||||||
|
df = pandas.concat([df,df2])
|
||||||
|
return df
|
||||||
|
|
||||||
|
def getOrgOrdNum(self,noStr):
|
||||||
|
tmp = noStr.split(" ")
|
||||||
|
res = tmp[0]
|
||||||
|
return res
|
||||||
|
|
||||||
|
def fakeOrderNo(self):
|
||||||
|
now = datetime.now()
|
||||||
|
mo = str(now.month).zfill(2)
|
||||||
|
y = now.year + 7000
|
||||||
|
y = str(y).zfill(4)
|
||||||
|
d = str(now.day).zfill(2)
|
||||||
|
h = str(now.hour).zfill(2)
|
||||||
|
m = str(now.minute).zfill(2)
|
||||||
|
ordernum = self.ordernumCount
|
||||||
|
end = str(ordernum).zfill(4)
|
||||||
|
self.ordernumCount = self.ordernumCount + 1
|
||||||
|
res = str(y)+str(mo)+str(d)+str(h)+str(m)+str(end)
|
||||||
|
return res
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
mergeOrders = mergeNewOrders()
|
||||||
|
df = mergeOrders.merge()
|
||||||
|
df.to_excel("./test.xlsx")
|
||||||
|
#print(mergeOrders.fakeOrderNo())
|
||||||
BIN
automations/new_orders/test.xlsx
Normal file
BIN
automations/new_orders/test.xlsx
Normal file
Binary file not shown.
BIN
automations/new_orders/스마트스토어_다운로드_암호해제본_샘플.xls
Normal file
BIN
automations/new_orders/스마트스토어_다운로드_암호해제본_샘플.xls
Normal file
Binary file not shown.
BIN
automations/new_orders/플레이오토_주문취합_다운로드파일_필드전체적용_샘플.xlsx
Normal file
BIN
automations/new_orders/플레이오토_주문취합_다운로드파일_필드전체적용_샘플.xlsx
Normal file
Binary file not shown.
BIN
automations/now/now.xlsx
Normal file
BIN
automations/now/now.xlsx
Normal file
Binary file not shown.
BIN
automations/plto.xlsx
Normal file
BIN
automations/plto.xlsx
Normal file
Binary file not shown.
52
automations/sendmail.py
Normal file
52
automations/sendmail.py
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
import smtplib, os
|
||||||
|
from email.mime.text import MIMEText
|
||||||
|
from email.mime.multipart import MIMEMultipart
|
||||||
|
from email.mime.base import MIMEBase
|
||||||
|
from email import encoders
|
||||||
|
|
||||||
|
class sendmail:
|
||||||
|
def __init__(self,recipient,title,contents,attachment):
|
||||||
|
self.sender = 'conteenew@gmail.com'
|
||||||
|
self.smtpserver = 'smtp.gmail.com'
|
||||||
|
self.smtpserverport = 587
|
||||||
|
self.serverpass = 'gzfscocayuutidxo'
|
||||||
|
self.recipient = recipient
|
||||||
|
self.title = title
|
||||||
|
self.contents = contents
|
||||||
|
self.attachment = attachment
|
||||||
|
self.cc = 'maddie@conteenew.com'
|
||||||
|
|
||||||
|
def smtprun(self):
|
||||||
|
smtp = smtplib.SMTP(self.smtpserver, self.smtpserverport)
|
||||||
|
smtp.ehlo()
|
||||||
|
smtp.starttls()
|
||||||
|
smtp.login(self.sender, self.serverpass)
|
||||||
|
smtp.sendmail(self.sender, self.recipient, self.message().as_string())
|
||||||
|
|
||||||
|
def message(self):
|
||||||
|
msg = MIMEMultipart()
|
||||||
|
msg['From'] = self.sender
|
||||||
|
msg['To'] = self.recipient
|
||||||
|
msg['Subject'] = self.title
|
||||||
|
msg['Cc'] = self.cc
|
||||||
|
msg.attach(MIMEText(self.contents, 'plain'))
|
||||||
|
attlist = self.attachment.split(",")
|
||||||
|
for i in range(len(attlist)):
|
||||||
|
attached_file = open(attlist[i], 'rb').read()
|
||||||
|
att = MIMEBase('application', "octet-stream")
|
||||||
|
att.set_payload(attached_file)
|
||||||
|
encoders.encode_base64(att)
|
||||||
|
att.add_header('Content-Disposition', 'attachment', filename=os.path.basename(self.attachment))
|
||||||
|
msg.attach(att)
|
||||||
|
return msg
|
||||||
|
|
||||||
|
#if __name__ == '__main__':
|
||||||
|
# #사용법
|
||||||
|
# to = 'maddiekorea@gmail.com'
|
||||||
|
# title = "Test"
|
||||||
|
# contents = """6...7"""
|
||||||
|
# #첨부는 쉼표로 여러개 넣을 수 있다.
|
||||||
|
# attachments = "/Users/maddiekorea/PycharmProjects/automations/플레이오토_주문취합_다운로드파일_필드전체적용_샘플.xlsx"
|
||||||
|
#
|
||||||
|
# mail = sendmail(to,title,contents,attachments)
|
||||||
|
# mail.smtprun()
|
||||||
BIN
automations/test.xlsx
Normal file
BIN
automations/test.xlsx
Normal file
Binary file not shown.
BIN
automations/test11.xlsx
Normal file
BIN
automations/test11.xlsx
Normal file
Binary file not shown.
BIN
automations/tmp/스마트스토어_전체주문발주발송관리_20220915_0938.xls
Normal file
BIN
automations/tmp/스마트스토어_전체주문발주발송관리_20220915_0938.xls
Normal file
Binary file not shown.
BIN
automations/tmp/아트박스_주문파일취합_2202_0908.xlsx
Normal file
BIN
automations/tmp/아트박스_주문파일취합_2202_0908.xlsx
Normal file
Binary file not shown.
BIN
automations/tmp/플레이오토_주문용파일취합_2022_0908.xlsx
Normal file
BIN
automations/tmp/플레이오토_주문용파일취합_2022_0908.xlsx
Normal file
Binary file not shown.
13
bigQuery_exercise/config/skb-home-ga4-44e5a11751e6.json
Normal file
13
bigQuery_exercise/config/skb-home-ga4-44e5a11751e6.json
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"type": "service_account",
|
||||||
|
"project_id": "skb-home-ga4",
|
||||||
|
"private_key_id": "44e5a11751e6e66c28d750defc71529a59c4e24d",
|
||||||
|
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC8omPC2i//wCML\nsx1TULfoFk2QtZWwYeXfCohGDvlEokk63oWAUZcR235xgzb8RON+vhGjXxQvSxtF\nsHGxgv+XKpR6PzpHU59UfJ2H5KtSROYwUvU2C+HxRxjlFMUcBGWa2EaFdtVs+nhg\nM9Lh2XG4Ps4u7BG6cWDA94xaSOSR1E+Ep/CeYS2bMX8K4cslL62wsGOkQPFQDHbP\nwKa7Kpz/yF9GDyxnW2qgUH9cUFqhqYAoaDC50cKf/DmbIeZhW93ILnia1ju7Hz+G\npUOrFt1v8/BbZD/LliZTenAz7Nnpmh8G66sNO4mVHNuauoSg+aNTpq6/L+Afzmto\nJJ599AINAgMBAAECggEAFphkF0nP8JRpDkR3CY0UbmxHf8NEijN718b48l1mTeqb\nl33io2+Ch0zRvVKgokC1OHAXiEiCEDUwr90WDVOZ/pdG4ErVFgil//aKXyYMwIbI\nxPaW8VGkj6R6zqv5fWTob88iyWdl4s8w3qMuikej59Q8GeJEsF7W3l54tTLgkDgX\nWBkrTsOLnRoAXaBt/AiNHW5jNOqhJFg+LBJZrEM3ZtzJjH/AMKFWk0kPbdsAmf0v\n9MzgR+mDQQpWbX9We6Y/YmVd2P3vHlgZVDA0t+PuUPMD/fgCDm3uPckDE85iE/IF\ncwW3oQkkrqanCAwXYwXd0Np/1CNWCPOQavdZ+fn9eQKBgQD+CbUiiUW7r1fN0JdN\nCYFBcqvkj1CZNjF0UTVRZVjQnBtDht4CvfdPJyEN0cCKQ+KqBq4ZSHkwSujikKFV\nSHVJ939pdcA+PC3OUtFdTWQW0mWIoANUG015gLG0/YdnjzoGQiHZQVNcs7vGg3RH\nQIjKxmdw2Dk2IlObHDwGBij9VQKBgQC+F10qv0XwvQrgxxXEHaMFSJdm4hJpd4ZJ\njOJMIJQWATxHeerwLGLenDJD9njPBXuSyJE8eHx6ed+YsPIAtwursIFliNT+eSfl\nXiN9GK6BWtUp4O3zp97uIpC+YbIw4pHQlYfJX/D062E09gpUEeHWkEDTXAV869vV\nfR34+dgx2QKBgFEKccF5v0g3kLA0yf+md5iUZ2e7nH+z/STZP0QfK60pD72ECdEg\nHwQePHo3HtA9BdMt3F5uc1LHovGcKAuX2OrmzLus984izo4Sd33nUXXCWuex/D3Z\nk+ad+pL9ijOsSltyv2+aWmipYc7bYr3URY9Cqf8iy2WMn9VMtY1Ka8sdAoGAVoOF\nqIXjC/zNrZ2OH3KplicCmRV88bkvSdwvxhvxqc4oJBOtxF8/JDeMfPf45aeGJTjZ\nON9RL+C1zeWCTqcATcSIL7DF14dGjBJ7Ll0EVuUDLQss4P7e7ByZKbyG/86uNHNJ\nmHHs1VsnI5Zy/u4gjambh1ZTPRaPN6u4726uYYkCgYAgCpzWVH3aPd504xCkknCA\n1dNQtihR8EoCOYNAi7Wcp4ovG2duBAsIYFW/1NZEuAQW3RKeat8E+TceInEteMP4\nYGMM+SOBurTAYWk2zkGfUwPx3IqQPe4c2CL6gxhjPa+t82WvkFTwTI0xG66wNLb/\nRqeHunq3ic57NNRmVCGE+w==\n-----END PRIVATE KEY-----\n",
|
||||||
|
"client_email": "ucomp01@skb-home-ga4.iam.gserviceaccount.com",
|
||||||
|
"client_id": "109878041240859967176",
|
||||||
|
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
||||||
|
"token_uri": "https://oauth2.googleapis.com/token",
|
||||||
|
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
|
||||||
|
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/ucomp01%40skb-home-ga4.iam.gserviceaccount.com",
|
||||||
|
"universe_domain": "googleapis.com"
|
||||||
|
}
|
||||||
20
bigQuery_exercise/main.py
Normal file
20
bigQuery_exercise/main.py
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# 샘플 Python 스크립트입니다.
|
||||||
|
import pandas
|
||||||
|
import glob
|
||||||
|
from google.cloud import bigquery
|
||||||
|
from google.oauth2 import service_account
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
key_path = glob.glob("./config/*.json")[0]
|
||||||
|
credentials = service_account.Credentials.from_service_account_file(key_path)
|
||||||
|
client = bigquery.Client(credentials=credentials, project=credentials.project_id)
|
||||||
|
sql = f"""SELECT * FROM `skb-home-ga4.analytics_319633764.events_20230906` LIMIT 10"""
|
||||||
|
query_job = client.query(sql)
|
||||||
|
df = query_job.to_dataframe()
|
||||||
|
print(df)
|
||||||
|
|
||||||
|
|
||||||
|
#skb-home-ga4.analytics_319633764
|
||||||
|
#skb-biz-ga4.analytics_320354291
|
||||||
|
#skb-cds-ga4.analytics_259129513
|
||||||
|
#skb-bds-ga4.analytics_259510316
|
||||||
32
bingWallpeper/main.py
Normal file
32
bingWallpeper/main.py
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import re,os,json,requests,urllib.request
|
||||||
|
|
||||||
|
URL = "http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1"
|
||||||
|
dir_path = os.environ['HOME'] + '/Pictures/Bing_Pic_of_the_Day/'
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
try:
|
||||||
|
image_data = json.loads(requests.get(URL).text)
|
||||||
|
image_url = 'http://www.bing.com' + image_data['images'][0]['url']
|
||||||
|
_image_name_arr = image_url.split("&")
|
||||||
|
__image_name_arr = _image_name_arr[0].split("?")
|
||||||
|
image_name = re.sub(r'^id\=',"",__image_name_arr[1])
|
||||||
|
|
||||||
|
if not os.path.exists(dir_path):
|
||||||
|
os.makedirs(dir_path)
|
||||||
|
|
||||||
|
file_path = dir_path + image_name
|
||||||
|
|
||||||
|
if os.path.exists(file_path) is False:
|
||||||
|
urllib.request.urlretrieve(image_url, filename=file_path)
|
||||||
|
image_desc = image_data['images'][0]['copyright']
|
||||||
|
command = 'gsettings set org.gnome.desktop.background picture-uri file://' + file_path
|
||||||
|
os.system(command)
|
||||||
|
notify = 'notify-send -u critical "Wallpaper for the Day updated!" "' + image_desc + '"'
|
||||||
|
os.system(notify)
|
||||||
|
else:
|
||||||
|
notify = 'notify-send -u critical "Bing Wallpaper" "Wallpaper for the day has been updated already!"'
|
||||||
|
os.system(notify)
|
||||||
|
except:
|
||||||
|
notify = 'notify-send -u critical "Bing Wallpaper" "Wallpaper can\'t be updated!"'
|
||||||
|
os.system(notify)
|
||||||
|
|
||||||
BIN
brandTermExtract/20230420_통합상품_키워드.xlsx
Normal file
BIN
brandTermExtract/20230420_통합상품_키워드.xlsx
Normal file
Binary file not shown.
BIN
brandTermExtract/_tmpTest.xlsx
Normal file
BIN
brandTermExtract/_tmpTest.xlsx
Normal file
Binary file not shown.
BIN
brandTermExtract/branddic_20230420.xlsx
Normal file
BIN
brandTermExtract/branddic_20230420.xlsx
Normal file
Binary file not shown.
BIN
brandTermExtract/branddic_blacklist_20230420.xlsx
Normal file
BIN
brandTermExtract/branddic_blacklist_20230420.xlsx
Normal file
Binary file not shown.
BIN
brandTermExtract/data.feather
Normal file
BIN
brandTermExtract/data.feather
Normal file
Binary file not shown.
BIN
brandTermExtract/dic.xlsx
Normal file
BIN
brandTermExtract/dic.xlsx
Normal file
Binary file not shown.
BIN
brandTermExtract/dic_edited.xlsx
Normal file
BIN
brandTermExtract/dic_edited.xlsx
Normal file
Binary file not shown.
84
brandTermExtract/main.py
Normal file
84
brandTermExtract/main.py
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
import pandas, re
|
||||||
|
# ⌃R을(를) 눌러 실행하거나 내 코드로 바꿉니다.
|
||||||
|
# 클래스, 파일, 도구 창, 액션 및 설정을 어디서나 검색하려면 ⇧ 두 번을(를) 누릅니다.
|
||||||
|
|
||||||
|
|
||||||
|
def load_excel(filename):
|
||||||
|
df = pandas.read_excel(filename, engine="openpyxl")
|
||||||
|
df = df[['po_idx_통합', 'po_idx_공구', 'po_idx_할인', 'po_idx_심쿵', 'po_title_통합', 'po_keyword_통합']]
|
||||||
|
df.to_feather("./data.feather")
|
||||||
|
return df
|
||||||
|
|
||||||
|
def getblacketedDics(terms, list):
|
||||||
|
terms = re.sub(r"\s","",terms).lower()
|
||||||
|
s = re.findall(r"\[(.*?)\]", terms)
|
||||||
|
for i in range(len(s)):
|
||||||
|
list.append(s[i])
|
||||||
|
return s
|
||||||
|
|
||||||
|
def getblacketedTerm(terms, diclist):
|
||||||
|
terms = re.sub(r"\s","",terms).lower()
|
||||||
|
s = re.findall(r"\[(.*?)\]", terms)
|
||||||
|
res = ''
|
||||||
|
for i in range(len(s)):
|
||||||
|
if s[i] in diclist:
|
||||||
|
res = res + str(s[i])
|
||||||
|
res = res + ","
|
||||||
|
res = re.sub(r"\,$","",res)
|
||||||
|
return res
|
||||||
|
|
||||||
|
def getblandTerm(terms, diclist):
|
||||||
|
terms = re.sub(r"\s","",terms).lower()
|
||||||
|
s = re.findall(r"\[(.*?)\]", terms)
|
||||||
|
res = ''
|
||||||
|
for i in range(len(s)):
|
||||||
|
if s[i] not in diclist:
|
||||||
|
res = res + str(s[i])
|
||||||
|
res = res + ","
|
||||||
|
res = re.sub(r"\,$","",res)
|
||||||
|
return res
|
||||||
|
|
||||||
|
def load_branddic():
|
||||||
|
dicfilename = "./branddic_20230420.xlsx"
|
||||||
|
df = pandas.read_excel(dicfilename, engine="openpyxl")
|
||||||
|
return df[0].values.tolist()
|
||||||
|
|
||||||
|
def load_brandblackdic():
|
||||||
|
dicfilename = "./branddic_blacklist_20230420.xlsx"
|
||||||
|
df = pandas.read_excel(dicfilename, engine="openpyxl")
|
||||||
|
return df[0].values.tolist()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
datadf = pandas.read_feather("./data.feather")
|
||||||
|
#diclist = load_branddic()
|
||||||
|
diclist = load_brandblackdic()
|
||||||
|
|
||||||
|
#datadf['branddic'] = datadf.apply(lambda x:getblacketedTerm(x['po_title_통합'], diclist), axis=1)
|
||||||
|
datadf['branddic'] = datadf.apply(lambda x: getblandTerm(x['po_title_통합'], diclist), axis=1)
|
||||||
|
datadf.to_excel("./_tmpTest.xlsx")
|
||||||
|
#print(datadf.info())
|
||||||
|
#print(dic)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# https://www.jetbrains.com/help/pycharm/에서 PyCharm 도움말 참조
|
||||||
|
#df = load_excel("./20230420_통합상품_키워드.xlsx")
|
||||||
|
#상품명 다른 케이스 리뷰
|
||||||
|
#sdf = df[(df['po_title_통합'] != df['po_title_공구']) & (df['po_title_공구'].notnull())]
|
||||||
|
#sdf = sdf[['po_idx_통합','po_title_통합','po_title_공구']]
|
||||||
|
#print(sdf)
|
||||||
|
#sdf.to_excel("./tmpTest.xlsx")
|
||||||
|
#통합명만 써도 됨...
|
||||||
|
#
|
||||||
|
#print(df.info())
|
||||||
|
|
||||||
|
#Build 기본 사전 데이터 밑 데이터
|
||||||
|
#df = pandas.read_feather("./data.feather")
|
||||||
|
#diclist = []
|
||||||
|
#df['blacked'] = df.apply(lambda x: getblacketedDics(x['po_title_통합'], diclist), axis=1)
|
||||||
|
#df.to_excel("./tmpTest.xlsx")
|
||||||
|
#diclist = list(set(diclist))
|
||||||
|
#dicdf = pandas.DataFrame(diclist)
|
||||||
|
#dicdf.to_excel("./dic.xlsx")
|
||||||
|
#print(dicdf)
|
||||||
|
#엑셀로 받아 사전을 빌드하여 branddic이름으로 저장.
|
||||||
BIN
brandTermExtract/tmpTest.xlsx
Normal file
BIN
brandTermExtract/tmpTest.xlsx
Normal file
Binary file not shown.
0
conteenew_python_apps/artwork/__init__.py
Normal file
0
conteenew_python_apps/artwork/__init__.py
Normal file
Binary file not shown.
BIN
conteenew_python_apps/artwork/__pycache__/app.cpython-39.pyc
Normal file
BIN
conteenew_python_apps/artwork/__pycache__/app.cpython-39.pyc
Normal file
Binary file not shown.
2
conteenew_python_apps/artwork/app.py
Normal file
2
conteenew_python_apps/artwork/app.py
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
import falcon.asgi
|
||||||
|
app = falcon.asgi.App()
|
||||||
129
conteenew_python_apps/bid/bid_controller.py
Normal file
129
conteenew_python_apps/bid/bid_controller.py
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
import subprocess,json,re,pymysql,datetime,requests
|
||||||
|
|
||||||
|
ini_path = "/var/www/conteenew_python_apps/bid/"
|
||||||
|
|
||||||
|
ini_srcs = [
|
||||||
|
{'srcName':'강남구청','scriptName':'bid_gangnam.py','status':'active'},
|
||||||
|
{'srcName':'나라장터','scriptName':'bid_naramarket.py','status':'active'},
|
||||||
|
{'srcName':'ebiz4u','scriptName':'bid_ebiz4u.py','status':'active'},
|
||||||
|
{'srcName':'s2b','scriptName':'bid_s2b.py','status':'active'},
|
||||||
|
{'srcName':'스타빌','scriptName':'bid_starbill.py','status':'inactive'}
|
||||||
|
]
|
||||||
|
|
||||||
|
bid_db = pymysql.connect(
|
||||||
|
user='teen',
|
||||||
|
passwd='tkatjdehd1!',
|
||||||
|
host='localhost',
|
||||||
|
db='bid',
|
||||||
|
charset='utf8'
|
||||||
|
)
|
||||||
|
|
||||||
|
timeNow = datetime.datetime.now()
|
||||||
|
|
||||||
|
print('Start at ' + timeNow.strftime('%Y-%m-%d %H:%M:%S') + '=========================================')
|
||||||
|
|
||||||
|
cursor_chkoutdated = bid_db.cursor(pymysql.cursors.DictCursor)
|
||||||
|
chkoutdated_sql = 'UPDATE `bid_data` SET `bid_status` = 5 where `bid_applyDateTo` <= "' + timeNow.strftime('%Y-%m-%d %H:%M:%S') + '"'
|
||||||
|
cursor_chkoutdated.execute(chkoutdated_sql)
|
||||||
|
bid_db.commit()
|
||||||
|
print(chkoutdated_sql)
|
||||||
|
|
||||||
|
term_cursor = bid_db.cursor(pymysql.cursors.DictCursor)
|
||||||
|
sql = "select * from bid_crwlTerms"
|
||||||
|
term_cursor.execute(sql)
|
||||||
|
termdb = term_cursor.fetchall()
|
||||||
|
terms = []
|
||||||
|
for i in range(len(termdb)):
|
||||||
|
term = termdb[i]['term']
|
||||||
|
terms.append(term)
|
||||||
|
|
||||||
|
command = []
|
||||||
|
for i in range(len(ini_srcs)):
|
||||||
|
if ini_srcs[i]['status'] == "active":
|
||||||
|
for j in range(len(terms)):
|
||||||
|
cmd = {}
|
||||||
|
cmd['cmd'] = ini_path + ini_srcs[i]['scriptName']
|
||||||
|
cmd['term_opt'] = '"' + terms[j] + '"'
|
||||||
|
command.append(cmd)
|
||||||
|
|
||||||
|
res = []
|
||||||
|
for i in range(len(command)):
|
||||||
|
cmd = 'python3 ' + command[i]['cmd'] + ' ' + command[i]['term_opt']
|
||||||
|
print(cmd)
|
||||||
|
data = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True,encoding='utf-8')
|
||||||
|
data = re.sub("\'",'\"',data)
|
||||||
|
data = json.loads(data)
|
||||||
|
if len(data) == 0: pass
|
||||||
|
elif data[0]['type'] == "검색/등록된 정보가 없습니다.": pass
|
||||||
|
elif data[0]['type'] == "검색된 데이터가 없습니다.": pass
|
||||||
|
else:
|
||||||
|
for j in range(len(data)):
|
||||||
|
res.append(data[j])
|
||||||
|
|
||||||
|
for i in range(len(res)):
|
||||||
|
cursor_count = bid_db.cursor(pymysql.cursors.DictCursor)
|
||||||
|
count_sql = 'select count(*) AS COUNT from `bid_data` where bid_url="' + res[i]['detailurl'] + '"'
|
||||||
|
cursor_count.execute(count_sql)
|
||||||
|
counts = cursor_count.fetchall()
|
||||||
|
dup = counts[0]['COUNT']
|
||||||
|
|
||||||
|
if res[i]['src'] == "강남구청":
|
||||||
|
timeEnd = datetime.datetime.strptime(res[i]['applyDateTo'], "%Y-%m-%d")
|
||||||
|
elif res[i]['src'] == "나라장터":
|
||||||
|
if res[i]['applyDateTo'] == "-":
|
||||||
|
timeEnd = datetime.datetime.strptime("9999/12/31 11:59", "%Y/%m/%d %H:%M")
|
||||||
|
elif res[i]['applyDateTo'] == "":
|
||||||
|
timeEnd = datetime.datetime.strptime("1999/12/31 11:59", "%Y/%m/%d %H:%M")
|
||||||
|
elif res[i]['applyDateTo'] == "공개이전":
|
||||||
|
timeEnd = datetime.datetime.strptime("9999/12/31 11:59", "%Y/%m/%d %H:%M")
|
||||||
|
else:
|
||||||
|
timeEnd = datetime.datetime.strptime(res[i]['applyDateTo'], "%Y/%m/%d %H:%M")
|
||||||
|
elif res[i]['src'] == "이비즈포유":
|
||||||
|
timeEnd = datetime.datetime.strptime(res[i]['applyDateTo'], "%Y-%m-%d %H:%M")
|
||||||
|
elif res[i]['src'] == "s2b":
|
||||||
|
timeEnd = datetime.datetime.strptime(res[i]['applyDateTo'], "%Y-%m-%d %H:%M")
|
||||||
|
else: pass
|
||||||
|
|
||||||
|
if dup == 0:
|
||||||
|
if timeNow < timeEnd:
|
||||||
|
cursor_insert = bid_db.cursor(pymysql.cursors.DictCursor)
|
||||||
|
value = "'','" + res[i]['src'] + "','" + res[i]['term'] + "','" + \
|
||||||
|
res[i]['type'] + "','" + res[i]['budget'] + "','" + \
|
||||||
|
res[i]['commitDate'] + "','" + res[i]['dept'] + "','" + \
|
||||||
|
res[i]['name'] + "','" + res[i]['detailurl'] + "','" + \
|
||||||
|
res[i]['applyDateFrom'] + "','" + str(timeEnd) + \
|
||||||
|
"',NULL,0,NOW(),NULL,NULL"
|
||||||
|
insert_sql = "INSERT INTO `bid_data` VALUES(" + value + ")"
|
||||||
|
cursor_insert.execute(insert_sql)
|
||||||
|
bid_db.commit()
|
||||||
|
print(insert_sql)
|
||||||
|
else:
|
||||||
|
cursor_check = bid_db.cursor(pymysql.cursors.DictCursor)
|
||||||
|
check_sql = 'select * from bid_data where `bid_url`="' + res[i]['detailurl'] + '"'
|
||||||
|
cursor_check.execute(check_sql)
|
||||||
|
getdata = cursor_check.fetchall()
|
||||||
|
if datetime.datetime.strptime(getdata[0]['bid_applyDateTo'], '%Y-%m-%d %H:%M:%S') < timeNow:
|
||||||
|
cursor_update = bid_db.cursor(pymysql.cursors.DictCursor)
|
||||||
|
update_sql = "UPDATE `bid_data` SET `bid_status` = 5 where idx=" + str(getdata[0]['idx'])
|
||||||
|
cursor_update.execute(update_sql)
|
||||||
|
bid_db.commit()
|
||||||
|
print(update_sql)
|
||||||
|
elif (timeEnd != getdata[0]['bid_applyDateTo']) or (res[i]['name'] != getdata[0]['bid_name']):
|
||||||
|
cursor_update = bid_db.cursor(pymysql.cursors.DictCursor)
|
||||||
|
update_sql = 'UPDATE `bid_data` SET `bid_applyDateTo` = "' + str(timeEnd) + \
|
||||||
|
'", `bid_name` ="' + res[i]['name'] + \
|
||||||
|
'" where idx=' + str(getdata[0]['idx'])
|
||||||
|
cursor_update.execute(update_sql)
|
||||||
|
bid_db.commit()
|
||||||
|
print(update_sql)
|
||||||
|
else:
|
||||||
|
print("pass")
|
||||||
|
|
||||||
|
bid_db.close()
|
||||||
|
|
||||||
|
#mailcheckurl = 'http://office.conteenew.com/functions/mail/bid_alert.php'
|
||||||
|
#resp = requests.get(mailcheckurl)
|
||||||
|
#resp.raise_for_status()
|
||||||
|
#html = resp.text
|
||||||
|
|
||||||
|
print('END' + ' =========================================')
|
||||||
79
conteenew_python_apps/bid/bid_ebiz4u.py
Normal file
79
conteenew_python_apps/bid/bid_ebiz4u.py
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
import requests, sys, bs4, urllib3, datetime, re
|
||||||
|
from dateutil.relativedelta import relativedelta
|
||||||
|
|
||||||
|
requests.packages.urllib3.disable_warnings()
|
||||||
|
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += ':HIGH:!DH:!aNULL'
|
||||||
|
try:
|
||||||
|
requests.packages.urllib3.contrib.pyopenssl.util.ssl_.DEFAULT_CIPHERS += ':HIGH:!DH:!aNULL'
|
||||||
|
except AttributeError:
|
||||||
|
# no pyopenssl support used / needed / available
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
term = sys.argv[1].encode('euc-kr')
|
||||||
|
#term = urllib.parse.quote_plus(term)
|
||||||
|
|
||||||
|
#startdate = datetime.datetime.now()
|
||||||
|
#enddate = datetime.datetime.now() + relativedelta(months=2)
|
||||||
|
|
||||||
|
#startdate = startdate.strftime('%Y-%m-%d')
|
||||||
|
#enddate = enddate.strftime('%Y-%m-%d')
|
||||||
|
|
||||||
|
#startdate = urllib.parse.quote_plus(startdate)
|
||||||
|
#enddate = urllib.parse.quote_plus(enddate)
|
||||||
|
|
||||||
|
|
||||||
|
url = "https://www.ebiz4u.co.kr/bid/bidding.do?"
|
||||||
|
|
||||||
|
data = {
|
||||||
|
"page": "",
|
||||||
|
"cmd": "listPublic",
|
||||||
|
"subcmd": "doPortalList",
|
||||||
|
"srchAspUrl": "",
|
||||||
|
"srchRfqNm": term,
|
||||||
|
"srchOrgNm": "",
|
||||||
|
"srchFrDt": "",
|
||||||
|
"srchToDt": ""
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = requests.get(url, params=data, verify=False)
|
||||||
|
resp.raise_for_status()
|
||||||
|
resp.encoding='EUC-KR'
|
||||||
|
html = resp.text
|
||||||
|
|
||||||
|
bs = bs4.BeautifulSoup(html, 'html.parser')
|
||||||
|
trs = bs.select('table.tbl_list tr')
|
||||||
|
|
||||||
|
res = []
|
||||||
|
|
||||||
|
for i in range(len(trs) - 1):
|
||||||
|
srcCode = trs[i + 1]
|
||||||
|
tdsele = {}
|
||||||
|
tdsele["src"] = "이비즈포유"
|
||||||
|
tdsele["term"] = sys.argv[1]
|
||||||
|
tdsele["type"] = ""
|
||||||
|
tdsele["budget"] = ""
|
||||||
|
tdsele["commitDate"] = ""
|
||||||
|
tdsele["dept"] = srcCode.select('span.subject')[0].getText().strip()
|
||||||
|
tdsele["name"] = srcCode.select('td')[0].getText().strip()
|
||||||
|
pat = "^" + tdsele["dept"]
|
||||||
|
tdsele["name"] = re.sub(pat,"",tdsele["name"])
|
||||||
|
targetUrl = srcCode.select('a')[0].get('href')
|
||||||
|
targethead = "https://www.ebiz4u.co.kr/bid/bidding.do?cmd=viewPublic&subcmd=vwIndexOnPortal&rfqNo="
|
||||||
|
targetfoot = "&aspId="
|
||||||
|
target = targetUrl.split("'")
|
||||||
|
tdsele["detailurl"] = targethead + target[1] + targetfoot + target[3]
|
||||||
|
tdsele["dept"] = tdsele["dept"] + " " + srcCode.select('td')[1].getText().strip()
|
||||||
|
timepat1 = srcCode.select('span.time')[0].getText().strip()
|
||||||
|
timepat2 = srcCode.select('span.time')[1].getText().strip()
|
||||||
|
tdsele["applyDateFrom"] = srcCode.select('td')[2].getText().strip()
|
||||||
|
pat = timepat1 + "$"
|
||||||
|
tdsele["applyDateFrom"] = re.sub(pat,"",tdsele["applyDateFrom"])
|
||||||
|
tdsele["applyDateFrom"] = tdsele["applyDateFrom"] + " " + timepat1
|
||||||
|
tdsele["applyDateTo"] = srcCode.select('td')[3].getText().strip()
|
||||||
|
pat = timepat2 + "$"
|
||||||
|
tdsele["applyDateTo"] = re.sub(pat,"",tdsele["applyDateTo"])
|
||||||
|
tdsele["applyDateTo"] = tdsele["applyDateTo"] + " " + timepat2
|
||||||
|
res.append(tdsele)
|
||||||
|
|
||||||
|
print(res)
|
||||||
60
conteenew_python_apps/bid/bid_gangnam.py
Normal file
60
conteenew_python_apps/bid/bid_gangnam.py
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
import requests, sys, bs4, re
|
||||||
|
|
||||||
|
term = sys.argv[1]
|
||||||
|
|
||||||
|
url = "https://www.gangnam.go.kr/contract/list.do?pgno=1&mid=ID05_041501&saup_field1_gb=3&saup_dept_cd=&keyfield=SAUP_NM&keyword=" \
|
||||||
|
+ term + "&srch_start_amt=&srch_end_amt="
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
|
||||||
|
"Accept-Encoding": "gzip, deflate, br",
|
||||||
|
"Accept-Language": "ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3",
|
||||||
|
"Cache-Control": "max-age=0",
|
||||||
|
"Connection": "keep-alive",
|
||||||
|
"Cookie": "JSESSIONID=baa_dI1wLJEFZeosbLHVxg-w1SGjCSDe5m77JFC1Oz5l8ZsbtJq0c4hVTuY_; WMONID=REfZ-vn3O8b; _ga=GA1.3.110539796.1632479167; siteContractModal=1; JSESSIONID=baa_dI1wLJEFZeosbLHVxg-w1SGjCSDe5m77JFC1Oz5l8ZsbtJq0c4hVTuY_; _gid=GA1.3.817966770.1633006424",
|
||||||
|
"Host": "www.gangnam.go.kr",
|
||||||
|
"Referer": "https://www.gangnam.go.kr/contract/list.do?pgno=4&mid=ID05_041501&saup_field1_gb=3&saup_dept_cd=&keyfield=SAUP_NM&keyword=&srch_start_amt=&srch_end_amt=",
|
||||||
|
"Sec-Fetch-Dest": "document",
|
||||||
|
"Sec-Fetch-Mode": "navigate",
|
||||||
|
"Sec-Fetch-Site": "same-origin",
|
||||||
|
"Sec-Fetch-User": "?1",
|
||||||
|
"Upgrade-Insecure-Requests": "1",
|
||||||
|
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:92.0) Gecko/20100101 Firefox/92.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = requests.get(url, headers=headers)
|
||||||
|
resp.raise_for_status()
|
||||||
|
html = resp.text
|
||||||
|
|
||||||
|
bs = bs4.BeautifulSoup(html, 'html.parser')
|
||||||
|
|
||||||
|
trs = bs.select('table.table tr')
|
||||||
|
|
||||||
|
res=[]
|
||||||
|
|
||||||
|
for i in range(len(trs) - 1):
|
||||||
|
tds = trs[i + 1].select('td')
|
||||||
|
tdsele = {}
|
||||||
|
for j in range(len(tds)):
|
||||||
|
if j == 0:
|
||||||
|
tdsele["src"] = "강남구청"
|
||||||
|
tdsele["term"] = term
|
||||||
|
tdsele["type"] = tds[j].getText().strip()
|
||||||
|
elif j == 1:
|
||||||
|
tdsele["commitDate"] = tds[j].getText().strip()
|
||||||
|
elif j == 2:
|
||||||
|
tdsele["name"] = re.sub("\,|\'","",tds[j].getText().strip())
|
||||||
|
tdsele["detailurl"] = "https://www.gangnam.go.kr" + tds[j].select('a')[0].get('href')
|
||||||
|
elif j == 3:
|
||||||
|
tdsele["budget"] = tds[j].getText().strip()
|
||||||
|
tdsele["budget"] = re.sub("원","",tdsele["budget"])
|
||||||
|
tdsele["budget"] = re.sub("\,", "", tdsele["budget"])
|
||||||
|
elif j == 4:
|
||||||
|
tdsele["dept"] = tds[j].getText().strip()
|
||||||
|
elif j == 5:
|
||||||
|
applyperiod = tds[j].getText().strip().split("~ ")
|
||||||
|
tdsele["applyDateFrom"] = applyperiod[0]
|
||||||
|
tdsele["applyDateTo"] = applyperiod[1]
|
||||||
|
res.append(tdsele)
|
||||||
|
|
||||||
|
print(res)
|
||||||
68
conteenew_python_apps/bid/bid_naramarket.py
Normal file
68
conteenew_python_apps/bid/bid_naramarket.py
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
import requests, sys, bs4, urllib, re, datetime
|
||||||
|
from dateutil.relativedelta import relativedelta
|
||||||
|
|
||||||
|
term = sys.argv[1].encode('euc-kr')
|
||||||
|
term = urllib.parse.quote_plus(term)
|
||||||
|
|
||||||
|
startdate = datetime.datetime.now() - relativedelta(months=1)
|
||||||
|
enddate = datetime.datetime.now() + relativedelta(months=3)
|
||||||
|
|
||||||
|
startdate = startdate.strftime('%Y/%m/%d')
|
||||||
|
enddate = enddate.strftime('%Y/%m/%d')
|
||||||
|
|
||||||
|
startdate = urllib.parse.quote_plus(startdate)
|
||||||
|
enddate = urllib.parse.quote_plus(enddate)
|
||||||
|
|
||||||
|
url = "http://www.g2b.go.kr:8101/ep/tbid/tbidList.do"
|
||||||
|
dataa = "?searchType=1&bidSearchType=1&taskClCds=1&bidNm=" + str(term) + "&searchDtType=1" + \
|
||||||
|
"&fromBidDt=" + startdate + "&toBidDt=" + enddate + \
|
||||||
|
"&fromOpenBidDt=&toOpenBidDt=&exceptEnd=Y&radOrgan=1&instNm=&instSearchRangeType=&refNo=&area=&areaNm=&industry=&industryCd=&budget=&budgetCompare=UP&detailPrdnmNo=&detailPrdnm=&procmntReqNo=&intbidYn=1®Yn=Y&recordCountPerPage=30"
|
||||||
|
url = url + dataa
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
"Content-Type": 'application/x-www-form-urlencoded',
|
||||||
|
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
|
||||||
|
'Accept-Encoding': 'gzip, deflate',
|
||||||
|
'Accept-Language': 'ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3',
|
||||||
|
'Connection': 'keep-alive',
|
||||||
|
#'Cookie' : 'ipmsperf_uuid=-1514895482682589748; JSESSIONID=25JThTdcFN12QpYxCYV6fcm4sTLBlZDBsLLc7hdvkHJfR0TbCbvN!-308104413; _KONEPS_PAGE=%3C%21%23%25%3ElistUrl%3C%40%25%7E%3E%2Fgtob%2Fall%2Fpr%2Festimate%2FreqEstimateOpenG2BList.do%3FbsnsDivCdSchs%3D0000%26cmd%3Dmain%26deadlineFromDt%3D2021%252F09%252F28%26deadlineToDt%3D2021%252F10%252F27%26estmtReqInsttNo%3D%26estmtSbjctSch%3D%25C8%25AB%25BA%25B8%26examinInstNm%3D%26instGuBun%3D%26insttCd%3D%26orderBy%3D1%26recordCountPerPage%3D10%3C%21%23%25%3EtbidListUrl%3C%40%25%7…tbidList.do%3Farea%3D%26areaNm%3D%26bidNm%3D%25C8%25AB%25BA%25B8%26bidSearchType%3D1%26budget%3D%26budgetCompare%3DUP%26detailPrdnm%3D%26detailPrdnmNo%3D%26fromBidDt%3D2021%252F08%252F29%26fromOpenBidDt%3D%26industry%3D%26industryCd%3D%26instNm%3D%26instSearchRangeType%3D%26intbidYn%3D1%26procmntReqNo%3D%26radOrgan%3D1%26recordCountPerPage%3D30%26refNo%3D%26regYn%3DY%26searchDtType%3D1%26searchType%3D1%26taskClCds%3D1%26toBidDt%3D2021%252F09%252F28%26toOpenBidDt%3D; ccsession=20210928194351000037c437c4cd36',
|
||||||
|
'Host': 'www.g2b.go.kr:8101',
|
||||||
|
'Referer': 'http://www.g2b.go.kr:8101/ep/tbid/tbidFwd.do?bidSearchType=1',
|
||||||
|
'Upgrade-Insecure-Requests': '1',
|
||||||
|
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:92.0) Gecko/20100101 Firefox/92.0'
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = requests.get(url, headers=headers)
|
||||||
|
resp.raise_for_status()
|
||||||
|
resp.encoding='EUC-KR'
|
||||||
|
html = resp.text
|
||||||
|
|
||||||
|
|
||||||
|
bs = bs4.BeautifulSoup(html, 'html.parser')
|
||||||
|
|
||||||
|
trs = bs.select("table.table_list_tbidTbl tr")
|
||||||
|
|
||||||
|
res=[]
|
||||||
|
|
||||||
|
for i in range(len(trs) - 1):
|
||||||
|
tds = trs[i + 1].select('td')
|
||||||
|
tdsele = {}
|
||||||
|
for j in range(len(tds)):
|
||||||
|
if j == 0:
|
||||||
|
tdsele["src"] = "나라장터"
|
||||||
|
tdsele["term"] = sys.argv[1]
|
||||||
|
tdsele["type"] = tds[j].getText().strip()
|
||||||
|
tdsele["budget"] = ""
|
||||||
|
tdsele["commitDate"] = ""
|
||||||
|
elif j == 3:
|
||||||
|
tdsele["name"] = tds[j].getText().strip()
|
||||||
|
tdsele["detailurl"] = tds[j].select('a')[0].get('href').strip()
|
||||||
|
elif j == 4:
|
||||||
|
tdsele["dept"] = tds[j].getText().strip()
|
||||||
|
elif j == 7:
|
||||||
|
applyperiod = tds[j].getText().strip().split("(")
|
||||||
|
tdsele["applyDateFrom"] = applyperiod[0]
|
||||||
|
tdsele["applyDateTo"] = re.sub("\)","",applyperiod[1])
|
||||||
|
res.append(tdsele)
|
||||||
|
|
||||||
|
print(res)
|
||||||
58
conteenew_python_apps/bid/bid_s2b.py
Normal file
58
conteenew_python_apps/bid/bid_s2b.py
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
import requests, sys, bs4, urllib, datetime
|
||||||
|
from dateutil.relativedelta import relativedelta
|
||||||
|
|
||||||
|
term = sys.argv[1].encode('euc-kr')
|
||||||
|
term = urllib.parse.quote_plus(term)
|
||||||
|
|
||||||
|
startdate = datetime.datetime.now() - relativedelta(months=2)
|
||||||
|
enddate = datetime.datetime.now() + relativedelta(months=1)
|
||||||
|
|
||||||
|
startdate = startdate.strftime('%Y%m%d')
|
||||||
|
enddate = enddate.strftime('%Y%m%d')
|
||||||
|
|
||||||
|
url = "https://www.s2b.kr/S2BNCustomer/stmo001.do"
|
||||||
|
|
||||||
|
dataa = "forwardName=list&pageNo=1&tender_num=&tender_step_code=&page_flag=&tender_sep1=1" + \
|
||||||
|
"&tender_name=" + term + "&company_name_s=&tender_sep2=1" + \
|
||||||
|
"&tender_date_start=" + startdate + "&tender_date_end=" + enddate + \
|
||||||
|
"&tender_item=0001&city="
|
||||||
|
|
||||||
|
url = url + "?" + dataa
|
||||||
|
|
||||||
|
resp = requests.get(url)
|
||||||
|
resp.raise_for_status()
|
||||||
|
resp.encoding='EUC-KR'
|
||||||
|
html = resp.text
|
||||||
|
|
||||||
|
bs = bs4.BeautifulSoup(html, 'html.parser')
|
||||||
|
|
||||||
|
trs = bs.select('table.td_dark_line tr')
|
||||||
|
|
||||||
|
newArr = []
|
||||||
|
|
||||||
|
for i in range(len(trs)):
|
||||||
|
if i > 5:
|
||||||
|
if i%2 == 0:
|
||||||
|
txtSrc = bs4.BeautifulSoup(str(trs[i - 1]) + str(trs[i]), 'html.parser')
|
||||||
|
newArr.append(txtSrc)
|
||||||
|
|
||||||
|
res = []
|
||||||
|
|
||||||
|
for i in range(len(newArr)):
|
||||||
|
cnts = newArr[i].select('td')
|
||||||
|
tdsele = {}
|
||||||
|
tdsele["src"] = "s2b"
|
||||||
|
tdsele["term"] = sys.argv[1]
|
||||||
|
tdsele["type"] = cnts[2].getText().strip()
|
||||||
|
tdsele["budget"] = ""
|
||||||
|
tdsele["commitDate"] = ""
|
||||||
|
tdsele["dept"] = cnts[6].getText().strip()
|
||||||
|
tdsele["name"] = cnts[3].getText().strip()
|
||||||
|
urlinfo = "https://www.s2b.kr/S2BNCustomer/stmo001.do?forwardName=view&tender_num=" + cnts[1].getText().strip()
|
||||||
|
tdsele["detailurl"] = urlinfo
|
||||||
|
tdsele["applyDateFrom"] = cnts[7].getText().strip()
|
||||||
|
tdsele["applyDateTo"] = cnts[8].getText().strip()
|
||||||
|
if tdsele["name"] != "":
|
||||||
|
res.append(tdsele)
|
||||||
|
|
||||||
|
print(res)
|
||||||
29
conteenew_python_apps/bid/bid_starbill.py
Normal file
29
conteenew_python_apps/bid/bid_starbill.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import requests, sys, bs4, urllib, locale
|
||||||
|
|
||||||
|
term = sys.argv[1]
|
||||||
|
|
||||||
|
url = "https://www.starbill.co.kr/comp/starbill/bidList.do"
|
||||||
|
|
||||||
|
data = {
|
||||||
|
"pageIndex": 1,
|
||||||
|
"bidDiv": 1,
|
||||||
|
"searchCondition": "title",
|
||||||
|
"searchKeyword": term
|
||||||
|
}
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
"Accept": "text/html, application/xhtml+xml, image/jxr, */*",
|
||||||
|
"Accept-Encoding": "gzip, deflate",
|
||||||
|
"Accept-Language": "ko",
|
||||||
|
"Connection": "Keep-Alive",
|
||||||
|
"Cookie": "JSESSIONID=33E5B26D4F4D7A9F93CC3F20914D4083; compNum=; _ga=GA1.3.1852339941.1633070307; _gid=GA1.3.1739891785.1633070307",
|
||||||
|
"Host": "www.starbill.co.kr",
|
||||||
|
"Referer": "https://www.starbill.co.kr/comp/main.do",
|
||||||
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = requests.post(url, params=data, headers=headers)
|
||||||
|
resp.raise_for_status()
|
||||||
|
html = resp.text
|
||||||
|
|
||||||
|
print(html)
|
||||||
BIN
conteenew_python_apps/color_profiles/AdobeRGB1998.icc
Executable file
BIN
conteenew_python_apps/color_profiles/AdobeRGB1998.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/AnimePalette.icc
Executable file
BIN
conteenew_python_apps/color_profiles/AnimePalette.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/AppleRGB.icc
Executable file
BIN
conteenew_python_apps/color_profiles/AppleRGB.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/BlackWhite.icc
Executable file
BIN
conteenew_python_apps/color_profiles/BlackWhite.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/BlacklightPoster.icc
Executable file
BIN
conteenew_python_apps/color_profiles/BlacklightPoster.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/CIERGB.icc
Executable file
BIN
conteenew_python_apps/color_profiles/CIERGB.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/CoatedFOGRA27.icc
Executable file
BIN
conteenew_python_apps/color_profiles/CoatedFOGRA27.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/CoatedFOGRA39.icc
Executable file
BIN
conteenew_python_apps/color_profiles/CoatedFOGRA39.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/CoatedGRACoL2006.icc
Executable file
BIN
conteenew_python_apps/color_profiles/CoatedGRACoL2006.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/CobaltCarmine.icc
Executable file
BIN
conteenew_python_apps/color_profiles/CobaltCarmine.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/ColorMatchRGB.icc
Executable file
BIN
conteenew_python_apps/color_profiles/ColorMatchRGB.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/ColorNegative.icc
Executable file
BIN
conteenew_python_apps/color_profiles/ColorNegative.icc
Executable file
Binary file not shown.
27
conteenew_python_apps/color_profiles/D50.camp
Executable file
27
conteenew_python_apps/color_profiles/D50.camp
Executable file
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<cam:ColorAppearanceModel
|
||||||
|
ID="http://schemas.microsoft.com/windows/2005/02/color/D50.camp"
|
||||||
|
xmlns:cam="http://schemas.microsoft.com/windows/2005/02/color/ColorAppearanceModel"
|
||||||
|
xmlns:wcs="http://schemas.microsoft.com/windows/2005/02/color/WcsCommonProfileTypes"
|
||||||
|
xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'>
|
||||||
|
|
||||||
|
<cam:ProfileName>
|
||||||
|
<wcs:Text xml:lang="en-US">WCS profile for ICC viewing conditions</wcs:Text>
|
||||||
|
</cam:ProfileName>
|
||||||
|
<cam:Description>
|
||||||
|
<wcs:Text xml:lang="en-US">Appropriate for a print in a D50 viewing booth</wcs:Text>
|
||||||
|
</cam:Description>
|
||||||
|
<cam:Author>
|
||||||
|
<wcs:Text xml:lang="en-US">Microsoft Corporation</wcs:Text>
|
||||||
|
</cam:Author>
|
||||||
|
|
||||||
|
<cam:ViewingConditions>
|
||||||
|
<cam:WhitePointName>D50</cam:WhitePointName>
|
||||||
|
<cam:Background X="19.3" Y="20.0" Z="16.5" />
|
||||||
|
<cam:Surround>Average</cam:Surround>
|
||||||
|
<cam:LuminanceOfAdaptingField>31.8</cam:LuminanceOfAdaptingField>
|
||||||
|
<cam:DegreeOfAdaptation>1</cam:DegreeOfAdaptation>
|
||||||
|
</cam:ViewingConditions>
|
||||||
|
|
||||||
|
</cam:ColorAppearanceModel>
|
||||||
|
|
||||||
27
conteenew_python_apps/color_profiles/D65.camp
Executable file
27
conteenew_python_apps/color_profiles/D65.camp
Executable file
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<cam:ColorAppearanceModel
|
||||||
|
ID="http://schemas.microsoft.com/windows/2005/02/color/D65.camp"
|
||||||
|
xmlns:cam="http://schemas.microsoft.com/windows/2005/02/color/ColorAppearanceModel"
|
||||||
|
xmlns:wcs="http://schemas.microsoft.com/windows/2005/02/color/WcsCommonProfileTypes"
|
||||||
|
xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'>
|
||||||
|
|
||||||
|
<cam:ProfileName>
|
||||||
|
<wcs:Text xml:lang="en-US">WCS profile for sRGB viewing conditions</wcs:Text>
|
||||||
|
</cam:ProfileName>
|
||||||
|
<cam:Description>
|
||||||
|
<wcs:Text xml:lang="en-US">Default profile for a sRGB monitor in standard viewing conditions</wcs:Text>
|
||||||
|
</cam:Description>
|
||||||
|
<cam:Author>
|
||||||
|
<wcs:Text xml:lang="en-US">Microsoft Corporation</wcs:Text>
|
||||||
|
</cam:Author>
|
||||||
|
|
||||||
|
<cam:ViewingConditions>
|
||||||
|
<cam:WhitePointName>D65</cam:WhitePointName>
|
||||||
|
<cam:Background X="19.0" Y="20.0" Z="21.78" />
|
||||||
|
<cam:Surround>Average</cam:Surround>
|
||||||
|
<cam:LuminanceOfAdaptingField>16.0</cam:LuminanceOfAdaptingField>
|
||||||
|
<cam:DegreeOfAdaptation>1</cam:DegreeOfAdaptation>
|
||||||
|
</cam:ViewingConditions>
|
||||||
|
|
||||||
|
</cam:ColorAppearanceModel>
|
||||||
|
|
||||||
BIN
conteenew_python_apps/color_profiles/DCDM_X'Y'Z'.icc
Executable file
BIN
conteenew_python_apps/color_profiles/DCDM_X'Y'Z'.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/DCI_P3.icc
Executable file
BIN
conteenew_python_apps/color_profiles/DCI_P3.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/EuroscaleCoated.icc
Executable file
BIN
conteenew_python_apps/color_profiles/EuroscaleCoated.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/EuroscaleUncoated.icc
Executable file
BIN
conteenew_python_apps/color_profiles/EuroscaleUncoated.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/FilmSceneUniversalPD.icc
Executable file
BIN
conteenew_python_apps/color_profiles/FilmSceneUniversalPD.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/GoldBlue.icc
Executable file
BIN
conteenew_python_apps/color_profiles/GoldBlue.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/GoldCrimson.icc
Executable file
BIN
conteenew_python_apps/color_profiles/GoldCrimson.icc
Executable file
Binary file not shown.
21
conteenew_python_apps/color_profiles/Graphics.gmmp
Executable file
21
conteenew_python_apps/color_profiles/Graphics.gmmp
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<gmm:GamutMapModel
|
||||||
|
ID="http://schemas.microsoft.com/windows/2005/02/color/Graphics.gmmp"
|
||||||
|
xmlns:gmm="http://schemas.microsoft.com/windows/2005/02/color/GamutMapModel"
|
||||||
|
xmlns:wcs="http://schemas.microsoft.com/windows/2005/02/color/WcsCommonProfileTypes"
|
||||||
|
xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'>
|
||||||
|
|
||||||
|
<gmm:ProfileName>
|
||||||
|
<wcs:Text xml:lang="en-US">Charts and graphs</wcs:Text>
|
||||||
|
</gmm:ProfileName>
|
||||||
|
<gmm:Description>
|
||||||
|
<wcs:Text xml:lang="en-US">Appropriate for ICC saturation rendering intent workflows</wcs:Text>
|
||||||
|
</gmm:Description>
|
||||||
|
<gmm:Author>
|
||||||
|
<wcs:Text xml:lang="en-US">Microsoft Corporation</wcs:Text>
|
||||||
|
</gmm:Author>
|
||||||
|
|
||||||
|
<gmm:DefaultBaselineGamutMapModel>HueMap</gmm:DefaultBaselineGamutMapModel>
|
||||||
|
|
||||||
|
</gmm:GamutMapModel>
|
||||||
|
|
||||||
BIN
conteenew_python_apps/color_profiles/GreenRed.icc
Executable file
BIN
conteenew_python_apps/color_profiles/GreenRed.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/JapanColor2001Coated.icc
Executable file
BIN
conteenew_python_apps/color_profiles/JapanColor2001Coated.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/JapanColor2001Uncoated.icc
Executable file
BIN
conteenew_python_apps/color_profiles/JapanColor2001Uncoated.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/JapanColor2002Newspaper.icc
Executable file
BIN
conteenew_python_apps/color_profiles/JapanColor2002Newspaper.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/JapanColor2003WebCoated.icc
Executable file
BIN
conteenew_python_apps/color_profiles/JapanColor2003WebCoated.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/JapanColor2011Coated.icc
Executable file
BIN
conteenew_python_apps/color_profiles/JapanColor2011Coated.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/JapanWebCoated.icc
Executable file
BIN
conteenew_python_apps/color_profiles/JapanWebCoated.icc
Executable file
Binary file not shown.
21
conteenew_python_apps/color_profiles/MediaSim.gmmp
Executable file
21
conteenew_python_apps/color_profiles/MediaSim.gmmp
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<gmm:GamutMapModel
|
||||||
|
ID="http://schemas.microsoft.com/windows/2005/02/color/MediaSim.gmmp"
|
||||||
|
xmlns:gmm="http://schemas.microsoft.com/windows/2005/02/color/GamutMapModel"
|
||||||
|
xmlns:wcs="http://schemas.microsoft.com/windows/2005/02/color/WcsCommonProfileTypes"
|
||||||
|
xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'>
|
||||||
|
|
||||||
|
<gmm:ProfileName>
|
||||||
|
<wcs:Text xml:lang="en-US">Proofing - simulate paper/media color</wcs:Text>
|
||||||
|
</gmm:ProfileName>
|
||||||
|
<gmm:Description>
|
||||||
|
<wcs:Text xml:lang="en-US">Appropriate for ICC absolute colorimetric rendering intent workflows</wcs:Text>
|
||||||
|
</gmm:Description>
|
||||||
|
<gmm:Author>
|
||||||
|
<wcs:Text xml:lang="en-US">Microsoft Corporation</wcs:Text>
|
||||||
|
</gmm:Author>
|
||||||
|
|
||||||
|
<gmm:DefaultBaselineGamutMapModel>HPMinCD_Absolute</gmm:DefaultBaselineGamutMapModel>
|
||||||
|
|
||||||
|
</gmm:GamutMapModel>
|
||||||
|
|
||||||
BIN
conteenew_python_apps/color_profiles/PAL_SECAM.icc
Executable file
BIN
conteenew_python_apps/color_profiles/PAL_SECAM.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/Pastel8Hues.icc
Executable file
BIN
conteenew_python_apps/color_profiles/Pastel8Hues.icc
Executable file
Binary file not shown.
21
conteenew_python_apps/color_profiles/Photo.gmmp
Executable file
21
conteenew_python_apps/color_profiles/Photo.gmmp
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<gmm:GamutMapModel
|
||||||
|
ID="http://schemas.microsoft.com/windows/2005/02/color/Photo.gmmp"
|
||||||
|
xmlns:gmm="http://schemas.microsoft.com/windows/2005/02/color/GamutMapModel"
|
||||||
|
xmlns:wcs="http://schemas.microsoft.com/windows/2005/02/color/WcsCommonProfileTypes"
|
||||||
|
xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'>
|
||||||
|
|
||||||
|
<gmm:ProfileName>
|
||||||
|
<wcs:Text xml:lang="en-US">Photography</wcs:Text>
|
||||||
|
</gmm:ProfileName>
|
||||||
|
<gmm:Description>
|
||||||
|
<wcs:Text xml:lang="en-US">Appropriate for ICC perceptual rendering intent workflows</wcs:Text>
|
||||||
|
</gmm:Description>
|
||||||
|
<gmm:Author>
|
||||||
|
<wcs:Text xml:lang="en-US">Microsoft Corporation</wcs:Text>
|
||||||
|
</gmm:Author>
|
||||||
|
|
||||||
|
<gmm:DefaultBaselineGamutMapModel>SGCK</gmm:DefaultBaselineGamutMapModel>
|
||||||
|
|
||||||
|
</gmm:GamutMapModel>
|
||||||
|
|
||||||
BIN
conteenew_python_apps/color_profiles/Photoshop4DefaultCMYK.icc
Executable file
BIN
conteenew_python_apps/color_profiles/Photoshop4DefaultCMYK.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/Photoshop5DefaultCMYK.icc
Executable file
BIN
conteenew_python_apps/color_profiles/Photoshop5DefaultCMYK.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/ProPhoto.icm
Executable file
BIN
conteenew_python_apps/color_profiles/ProPhoto.icm
Executable file
Binary file not shown.
21
conteenew_python_apps/color_profiles/Proofing.gmmp
Executable file
21
conteenew_python_apps/color_profiles/Proofing.gmmp
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<gmm:GamutMapModel
|
||||||
|
ID="http://schemas.microsoft.com/windows/2005/02/color/Proofing.gmmp"
|
||||||
|
xmlns:gmm="http://schemas.microsoft.com/windows/2005/02/color/GamutMapModel"
|
||||||
|
xmlns:wcs="http://schemas.microsoft.com/windows/2005/02/color/WcsCommonProfileTypes"
|
||||||
|
xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'>
|
||||||
|
|
||||||
|
<gmm:ProfileName>
|
||||||
|
<wcs:Text xml:lang="en-US">Proofing and line art</wcs:Text>
|
||||||
|
</gmm:ProfileName>
|
||||||
|
<gmm:Description>
|
||||||
|
<wcs:Text xml:lang="en-US">Appropriate for ICC relative colorimetric rendering intent workflows</wcs:Text>
|
||||||
|
</gmm:Description>
|
||||||
|
<gmm:Author>
|
||||||
|
<wcs:Text xml:lang="en-US">Microsoft Corporation</wcs:Text>
|
||||||
|
</gmm:Author>
|
||||||
|
|
||||||
|
<gmm:DefaultBaselineGamutMapModel>HPMinCD_Relative</gmm:DefaultBaselineGamutMapModel>
|
||||||
|
|
||||||
|
</gmm:GamutMapModel>
|
||||||
|
|
||||||
BIN
conteenew_python_apps/color_profiles/RSWOP.icm
Executable file
BIN
conteenew_python_apps/color_profiles/RSWOP.icm
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/RedBlueYelllow.icc
Executable file
BIN
conteenew_python_apps/color_profiles/RedBlueYelllow.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/SMPTE-C.icc
Executable file
BIN
conteenew_python_apps/color_profiles/SMPTE-C.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/SiennaBlue.icc
Executable file
BIN
conteenew_python_apps/color_profiles/SiennaBlue.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/Smokey.icc
Executable file
BIN
conteenew_python_apps/color_profiles/Smokey.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/TealMagentaGold.icc
Executable file
BIN
conteenew_python_apps/color_profiles/TealMagentaGold.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/TotalInkPreview.icc
Executable file
BIN
conteenew_python_apps/color_profiles/TotalInkPreview.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/TurquoiseSepia.icc
Executable file
BIN
conteenew_python_apps/color_profiles/TurquoiseSepia.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/USNewsprintSNAP2007.icc
Executable file
BIN
conteenew_python_apps/color_profiles/USNewsprintSNAP2007.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/USSheetfedCoated.icc
Executable file
BIN
conteenew_python_apps/color_profiles/USSheetfedCoated.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/USSheetfedUncoated.icc
Executable file
BIN
conteenew_python_apps/color_profiles/USSheetfedUncoated.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/USWebCoatedSWOP.icc
Executable file
BIN
conteenew_python_apps/color_profiles/USWebCoatedSWOP.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/USWebUncoated.icc
Executable file
BIN
conteenew_python_apps/color_profiles/USWebUncoated.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/UncoatedFOGRA29.icc
Executable file
BIN
conteenew_python_apps/color_profiles/UncoatedFOGRA29.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/VideoHD.icc
Executable file
BIN
conteenew_python_apps/color_profiles/VideoHD.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/VideoHD16-235.icc
Executable file
BIN
conteenew_python_apps/color_profiles/VideoHD16-235.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/VideoNTSC.icc
Executable file
BIN
conteenew_python_apps/color_profiles/VideoNTSC.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/VideoNTSC16-235.icc
Executable file
BIN
conteenew_python_apps/color_profiles/VideoNTSC16-235.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/VideoPAL.icc
Executable file
BIN
conteenew_python_apps/color_profiles/VideoPAL.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/VideoPAL16-235.icc
Executable file
BIN
conteenew_python_apps/color_profiles/VideoPAL16-235.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/WebCoatedFOGRA28.icc
Executable file
BIN
conteenew_python_apps/color_profiles/WebCoatedFOGRA28.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/WebCoatedSWOP2006Grade3.icc
Executable file
BIN
conteenew_python_apps/color_profiles/WebCoatedSWOP2006Grade3.icc
Executable file
Binary file not shown.
BIN
conteenew_python_apps/color_profiles/WebCoatedSWOP2006Grade5.icc
Executable file
BIN
conteenew_python_apps/color_profiles/WebCoatedSWOP2006Grade5.icc
Executable file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user