def Update(self): ############################# # カウント対象か if self.FLG_Valid != True: ##更新なし return True ############################# # ドメインの抽出 wDomain = self.Obj_Parent.CHR_Account.split("@") if len(wDomain) != 2: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_Traffic: Update: Illigal admin_id: " + self.Obj_Parent.CHR_Account) return False wDomain = wDomain[1] ############################# # DB接続 wOBJ_DB = CLS_PostgreSQL_Use(gVal.DEF_STR_FILE['DBinfo_File']) wRes = wOBJ_DB.GetIniStatus() if wRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_Traffic: Update: DB Connect test is failed: " + wRes['Reason'] + " domain=" + wDomain) wOBJ_DB.Close() return False ############################# # ドメイン存在チェック wQuery = "select * from TBL_TRAFFIC_DATA where " + \ " domain = '" + wDomain + "' " + \ ";" wRes = wOBJ_DB.RunQuery(wQuery) wRes = wOBJ_DB.GetQueryStat() if wRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_Traffic: Update: Run Query is failed: " + wRes['Reason'] + " query=" + wRes['Query']) wOBJ_DB.Close() return False if len(wRes['Responce']['Data']) != 1: ##存在しない self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_Traffic: Update: select Domain is failed: " + " domain=" + wDomain + " nums=" + str(len(wRes['Responce']['Data']))) wOBJ_DB.Close() return False ############################# # カウント値の取り出し for wLineTap in wRes['Responce']['Data']: wGetTap = [] for wCel in wLineTap: wGetTap.append(wCel) ## [0] ..domain ## [1] ..count ## [2] ..rat_count ## [3] ..now_count ## [4] ..rat_days ## [5] ..now_days wCount = int(wGetTap[1]) ############################# # カウントアップ wCount += self.VAL_NowCount ############################# # テーブルの更新 wQuery = "update TBL_TRAFFIC_DATA set " + \ "count = " + str(wCount) + " " + \ "where domain = '" + wDomain + "' ;" wRes = wOBJ_DB.RunQuery(wQuery) wRes = wOBJ_DB.GetQueryStat() if wRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_Traffic: Update: Update Count is failed: " + wRes['Reason'] + " domain=" + wDomain) wOBJ_DB.Close() return False ############################# # DB切断 wOBJ_DB.Close() return True #成功
def Get_Trend(self): ############################# # ドメインの抽出 wDomain = self.Obj_Parent.CHR_Account.split("@") if len(wDomain) != 2: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_Trend: Get_Trend: Illigal admin_id: " + self.Obj_Parent.CHR_Account) return wDomain = wDomain[1] ############################# # トレンド取得対象のドメインか if wDomain not in self.ARR_SendDomain: self.Obj_Parent.OBJ_Mylog.Log('c', "トレンド取得対象外のドメイン") return ############################# # mastodonからトレンド取得 wRes = self.__getTrends() if wRes['Result'] != True: self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_Trend: Get_Trend: Trend read failed: " + wRes['Reason']) return ############################# # DB接続 wOBJ_DB = CLS_PostgreSQL_Use(gVal.DEF_STR_FILE['DBinfo_File']) wRes = wOBJ_DB.GetIniStatus() if wRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_Trend: Get_Trend: DB Connect test is failed: " + wRes['Reason']) wOBJ_DB.Close() return ############################# # 自ドメインのトレンド情報を一旦削除 wQuery = "delete from TBL_TREND where domain = '" + wDomain + "'" + \ ";" wDBRes = wOBJ_DB.RunQuery(wQuery) wDBRes = wOBJ_DB.GetQueryStat() if wDBRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_Trend: Get_Trend: Run Query is failed: " + wDBRes['Reason'] + " query=" + wDBRes['Query']) wOBJ_DB.Close() return ############################# # 最新のトレンド情報を追加 wKeyList = self.ARR_Trend.keys() wRank = 1 for wKey in self.ARR_Trend: wName = str(self.ARR_Trend[wKey]['name']).replace("'", "''") wQuery = "insert into TBL_TREND values (" + \ str(wRank) + "," + \ "'" + wName + "'," + \ "'" + wDomain + "'," + \ str(self.ARR_Trend[wKey]['uses']) + "," + \ str(self.ARR_Trend[wKey]['accs']) + "," + \ "'" + str(self.ARR_Trend[wKey]['lupdate']) + "' " + \ ") ;" wDBRes = wOBJ_DB.RunQuery(wQuery) wDBRes = wOBJ_DB.GetQueryStat() if wDBRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_Trend: Get_Trend: Run Query is failed: " + wDBRes['Reason'] + " query=" + wDBRes['Query']) wOBJ_DB.Close() return wRank += 1 ############################# # 正常終了 wOBJ_DB.Close() ############################# # カウント self.STR_Cope['Now_Cope'] += len(self.ARR_Trend) return
def SendTraffic(self): ############################# # トラヒックが有効か if gVal.STR_MasterConfig['Traffic'] != "on": return False ############################# # MasterUserか if gVal.STR_MasterConfig['MasterUser'] != self.Obj_Parent.CHR_Account: return False #SubUserは抜ける ############################# # 1時間経ってる周回か if gVal.STR_TimeInfo['OneHour'] == False: return False #Traffic送信周回ではない ############################# # トゥート送信対象のトラヒックドメイン読み込み ###読み出し先初期化 if self.__getTrafficPatt() != True: return False #失敗 if len(self.ARR_SendDomain) == 0: ###デフォルトだと指定あるのでいちお入れる self.Obj_Parent.OBJ_Mylog.Log('c', "CLS_Traffic: トラヒック送信の指定先=なし") return False ###対象なし ############################# # ドメインの抽出 wDomain = self.Obj_Parent.CHR_Account.split("@") if len(wDomain) != 2: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_Traffic: Update: Illigal admin_id: " + self.Obj_Parent.CHR_Account) return False wDomain = wDomain[1] ############################# # 送信処理開始 ############################# # DB接続 wOBJ_DB = CLS_PostgreSQL_Use(gVal.DEF_STR_FILE['DBinfo_File']) wRes = wOBJ_DB.GetIniStatus() if wRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_Traffic: SendTraffic: DB Connect test is failed: " + wRes['Reason'] + " domain=" + wDomain) wOBJ_DB.Close() return False ############################# # 全トラヒックのロード wQuery = "select * from TBL_TRAFFIC_DATA ;" wRes = wOBJ_DB.RunQuery(wQuery) wRes = wOBJ_DB.GetQueryStat() if wRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_Traffic: SendTraffic: Run Query is failed: " + wRes['Reason'] + " query=" + wRes['Query']) wOBJ_DB.Close() return False if len(wRes['Responce']['Data']) == 0: ##トラヒック情報なし self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_Traffic: SendTraffic: TBL_TRAFFIC_DATA record is 0") wOBJ_DB.Close() return False ############################# # カウント値の取り出しと、リセット wTraffic = {} wIndex = 0 for wLineTap in wRes['Responce']['Data']: ##領域の準備 wTraffic.update({wIndex: ""}) wTraffic[wIndex] = {} wTraffic[wIndex].update({"domain": ""}) wTraffic[wIndex].update({"count": 0}) wTraffic[wIndex].update({"rat_count": 0}) wTraffic[wIndex].update({"now_count": 0}) wTraffic[wIndex].update({"rat_days": 0}) wTraffic[wIndex].update({"now_days": 0}) wTraffic[wIndex].update({"rat_wday": 0}) wTraffic[wIndex].update({"now_wday": 0}) ##カウンタの取り出し wGetTap = [] for wCel in wLineTap: wGetTap.append(wCel) ## [0] ..domain ## [1] ..count ## [2] ..rat_count ## [3] ..now_count ## [4] ..rat_days ## [5] ..now_days ##領域へロード wTraffic[wIndex].update({"domain": wGetTap[0].strip()}) wTraffic[wIndex].update({"count": int(wGetTap[1])}) wTraffic[wIndex].update({"rat_count": int(wGetTap[2])}) wTraffic[wIndex].update({"now_count": int(wGetTap[3])}) wTraffic[wIndex].update({"rat_days": int(wGetTap[4])}) wTraffic[wIndex].update({"now_days": int(wGetTap[5])}) ##カウンタのリセットと、過去カウンタの記録(入れ替え) wTraffic[wIndex]['rat_count'] = wTraffic[wIndex][ 'now_count'] # 1時間前 wTraffic[wIndex]['now_count'] = wTraffic[wIndex][ 'count'] # 現在(後ろで送信) wTraffic[wIndex]['now_days'] += wTraffic[wIndex]['count'] # 1日に加算 wTraffic[wIndex]['count'] = 0 ### 1日経った =twitterに送信する if gVal.STR_TimeInfo['OneDay'] == True: wTraffic[wIndex]['rat_wday'] = wTraffic[wIndex]['rat_days'] wTraffic[wIndex]['now_wday'] = wTraffic[wIndex]['now_days'] wTraffic[wIndex]['rat_days'] = wTraffic[wIndex]['now_days'] wTraffic[wIndex]['now_days'] = 0 ##DBを更新 wQuery = "update TBL_TRAFFIC_DATA set " + \ "count = " + str(wTraffic[wIndex]['count']) + ", " + \ "rat_count = " + str(wTraffic[wIndex]['rat_count']) + ", " + \ "now_count = " + str(wTraffic[wIndex]['now_count']) + ", " + \ "rat_days = " + str(wTraffic[wIndex]['rat_days']) + ", " + \ "now_days = " + str(wTraffic[wIndex]['now_days']) + " " + \ "where domain = '" + wTraffic[wIndex]['domain'] + "' ;" wRes = wOBJ_DB.RunQuery(wQuery) wRes = wOBJ_DB.GetQueryStat() if wRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_Traffic: SendTraffic: Standby reset is failed: " + wRes['Reason'] + " domain=" + wTraffic[wIndex]['domain']) wOBJ_DB.Close() return False ##インデックス更新 wIndex += 1 ############################# # DB切断 wOBJ_DB.Close() ############################# # 送信するトラヒックの作成 ############################# # トラヒック送信対象の順番に入れ替える wARR_SendTraffic = {} wIndex = 0 wKeyList = wTraffic.keys() for wSendDomain in self.ARR_SendDomain: ##対象のトラヒックを探す for wKey in wKeyList: if wTraffic[wKey]['domain'] != wSendDomain: continue ##ヒット wARR_SendTraffic.update({wIndex: wTraffic[wKey]}) wIndex += 1 ############################# # トゥートの組み立て wCHR_TimeDate = gVal.STR_TimeInfo['TimeDate'].split(" ") ## wCHR_Title = "Mastodon Traffic: " + wCHR_TimeDate[0] + " " + str(gVal.STR_TimeInfo['Hour']) + "時台" wCHR_Title = "Mastodon Traffic: " + wCHR_TimeDate[0] + " " + str( gVal.STR_TimeInfo['Hour']) + "時" wCHR_Body = "" wKeyList = wARR_SendTraffic.keys() for wIndex in wKeyList: wCHR_Body = wCHR_Body + wARR_SendTraffic[wIndex][ 'domain'] + ": " + str(wARR_SendTraffic[wIndex]['now_count']) if wARR_SendTraffic[wIndex]['rat_count'] >= 0: ##bot起動の最初の1時間は差を出さない wRateCount = wARR_SendTraffic[wIndex][ 'now_count'] - wARR_SendTraffic[wIndex]['rat_count'] wCHR_Body = wCHR_Body + "(" if wRateCount > 0: wCHR_Body = wCHR_Body + "+" wCHR_Body = wCHR_Body + str(wRateCount) + ")" + '\n' else: wCHR_Body = wCHR_Body + '\n' wCHR_Toot = wCHR_Body + "#" + gVal.STR_MasterConfig['TrafficTag'] ############################# # トゥートの送信 wRes = self.Obj_Parent.OBJ_MyDon.Toot(status=wCHR_Toot, spoiler_text=wCHR_Title, visibility=self.CHR_SendRange) if wRes['Result'] != True: self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_Traffic: SendTraffic: Mastodon error: " + wRes['Reason']) return False ############################# # Twitterが有効か if gVal.STR_MasterConfig['Twitter'] != "on": return True #トラヒックは送信済 ############################# # 1日経ってる周回か if gVal.STR_TimeInfo['OneDay'] == False: return True #トラヒックは送信済 ############################# # ツイートの組み立て wCHR_TimeDate = gVal.STR_TimeInfo['TimeDate'].split(" ") ## wCHR_Title = "Mastodon Traffic: " + wCHR_TimeDate[0] + " " + str(gVal.STR_TimeInfo['Hour']) + "時" wCHR_Title = "Mastodon Traffic: " + wCHR_TimeDate[0] wCHR_Body = "" wKeyList = wARR_SendTraffic.keys() for wIndex in wKeyList: wCHR_Body = wCHR_Body + wARR_SendTraffic[wIndex][ 'domain'] + ": " + str(wARR_SendTraffic[wIndex]['now_wday']) if wARR_SendTraffic[wIndex]['rat_wday'] >= 0: ##bot起動の最初の1日は差を出さない wRateCount = wARR_SendTraffic[wIndex][ 'now_wday'] - wARR_SendTraffic[wIndex]['rat_wday'] wCHR_Body = wCHR_Body + "(" if wRateCount > 0: wCHR_Body = wCHR_Body + "+" wCHR_Body = wCHR_Body + str(wRateCount) + ")" + '\n' else: wCHR_Body = wCHR_Body + '\n' ## wCHR_Tweet = wCHR_Title + '\n' + wCHR_Body + "#" + gVal.STR_MasterConfig['TwitterTag'] ## if gVal.STR_MasterConfig['TwitterTag']!="" : ## wCHR_Tweet = wCHR_Tweet + "#" + gVal.STR_MasterConfig['TwitterTag'] wCHR_Tweet = wCHR_Title + '\n' + wCHR_Body wARR_Tweet = wCHR_Tweet.split('\n') #チェック用の行にバラす ############################# # タグを抜いた文字数を計算する wTwitterTag = "" if gVal.STR_MasterConfig['TwitterTag'] == "": wMAX_Tweet = 140 else: wTwitterTag = '\n' + "#" + gVal.STR_MasterConfig['TwitterTag'] wMAX_Tweet = 140 - len(wTwitterTag) ############################# # 文字数を140字に収める # 最後尾のトラヒック情報(ドメイン別)を1つずつ削って収める for wI in list(range(len(wARR_Tweet))): ## if len(wCHR_Tweet)<=140 : if len(wCHR_Tweet) <= wMAX_Tweet: break #140字に収まっている ##最後尾を削って文字列に直す del wARR_Tweet[-1] wCHR_Tweet = '\n'.join(wARR_Tweet) ############################# # 1番目のドメインを最後尾に移動(Twitter上で目立たせる) wARR_Tweet = wCHR_Tweet.split('\n') if len(wARR_Tweet) >= 2: wARR_Tweet.append(wARR_Tweet[1]) del wARR_Tweet[1] wCHR_Tweet = '\n'.join(wARR_Tweet) wCHR_Tweet = wCHR_Tweet + wTwitterTag #タグを付ける ############################# # ツイートの送信 if gVal.FLG_Test_Mode == False: wRes = self.Obj_Parent.OBJ_Twitter.Tweet(wCHR_Tweet) if wRes['Result'] != True: self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_Traffic: SendTraffic: Twitter API Error: " + wRes['Reason']) ##失敗しても処理は継続 else: wStr = "Twitter(TestMode): ツイート内容= " + '\n' + wCHR_Tweet self.Obj_Parent.OBJ_Mylog.Log('b', wStr, inView=True) return True #トラヒックは送信済
def WordStudy(self, inCont): ############################# # 単語なし if inCont == "": return False ############################# # ' 文字が含まれていたら除外する ## wRes = CLS_OSIF.sRe_Search( "'", inCont ) ## if wRes : if inCont.find("'") >= 0: return False ############################# # ワード収集が有効か if gVal.STR_MasterConfig['WordStudy'] != "on": return False #無効 ############################# # 今回の学習数が上限か if self.STR_Stat['StudyNum'] >= gVal.DEF_STR_TLNUM['studyNum']: return False #今回は学習しない ############################# # DB接続 wOBJ_DB = CLS_PostgreSQL_Use(gVal.DEF_STR_FILE['DBinfo_File']) wRes = wOBJ_DB.GetIniStatus() if wRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_WordCorr: WordStudy: DB Connect test is failed: " + wRes['Reason']) wOBJ_DB.Close() return False wVAL_Rate_WordNum = -1 ############################# # 1日1回、古いレコードを削除する if gVal.STR_TimeInfo['OneDay'] == True: ###現在のレコード数 wDBRes = wOBJ_DB.RunCount("TBL_WORD_CORRECT") wDBRes = wOBJ_DB.GetQueryStat() if wDBRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_WordCorr: WordStudy: Run Query is failed: " + wDBRes['Reason'] + " query=" + wDBRes['Query']) wOBJ_DB.Close() return False wVAL_Rate_WordNum = wDBRes['Responce'] ###指定日付の抽出 wLag = gVal.DEF_STR_TLNUM['studyDay'] * 24 * 60 * 60 ## wLagTime = CLS_OSIF.sTimeLag( gVal.STR_TimeInfo['TimeDate'], inThreshold=wLag, inTimezone=-1 ) wLagTime = CLS_OSIF.sTimeLag(inThreshold=wLag, inTimezone=-1) if wLagTime['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_WordCorr: WordStudy: sTimeLag is failed") wOBJ_DB.Close() return False ###単語テーブル wQuery = "delete from TBL_WORD_CORRECT where lupdate < " + \ "timestamp '" + str(wLagTime['RateTime']) + "' " + \ ";" wDBRes = wOBJ_DB.RunQuery(wQuery) wDBRes = wOBJ_DB.GetQueryStat() if wDBRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_WordCorr: WordStudy: Run Query is failed (Old TBL_WORD_CORRECT delete): " + wDBRes['Reason'] + " query=" + wDBRes['Query']) wOBJ_DB.Close() return False ###品詞パターン テーブル wQuery = "delete from TBL_CLAZ_LIST where lupdate < " + \ "timestamp '" + str(wLagTime['RateTime']) + "' " + \ ";" wDBRes = wOBJ_DB.RunQuery(wQuery) wDBRes = wOBJ_DB.GetQueryStat() if wDBRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_WordCorr: WordStudy: Run Query is failed (Old TBL_CLAZ_LIST delete): " + wDBRes['Reason'] + " query=" + wDBRes['Query']) wOBJ_DB.Close() return False ###削除後レコード数 wDBRes = wOBJ_DB.RunCount("TBL_WORD_CORRECT") wDBRes = wOBJ_DB.GetQueryStat() if wDBRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_WordCorr: WordStudy: Run Query is failed: " + wDBRes['Reason'] + " query=" + wDBRes['Query']) wOBJ_DB.Close() return False wVAL_WordNum = wDBRes['Responce'] ###削除数 wVAL_Delete_WordNum = wVAL_Rate_WordNum - wVAL_WordNum self.STR_Stat["Delete"] += wVAL_Delete_WordNum self.Obj_Parent.OBJ_Mylog.Log( 'b', "古い単語・品詞パターン削除: 対象=" + str(wLagTime['RateTime']) + " 以前") ############################# # レコード数の抽出 if wVAL_Rate_WordNum == -1: ###削除で結果出してない場合に処理する wDBRes = wOBJ_DB.RunCount("TBL_WORD_CORRECT") wDBRes = wOBJ_DB.GetQueryStat() if wDBRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_WordCorr: WordStudy: Run Query is failed: " + wDBRes['Reason'] + " query=" + wDBRes['Query']) wOBJ_DB.Close() return False wVAL_WordNum = wDBRes['Responce'] ############################# # 学習数が上限か if gVal.DEF_STR_TLNUM['studyMax'] <= wVAL_WordNum: if self.STR_Stat['WordLimit'] == False: self.Obj_Parent.OBJ_Mylog.Log( 'b', "学習不能(単語登録数上限: " + str(gVal.DEF_STR_TLNUM['studyMax']) + "件)") self.STR_Stat['WordLimit'] = True wOBJ_DB.Close() return False #上限 ############################# # デコーダで解読 (出力は辞書型) wGetWords = self.__analizeMeCab(inCont) if len(wGetWords) == 0: self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_WordCorr: WordStudy: MeCab analize result is zero, or failed" ) wOBJ_DB.Close() return False #失敗 # ここまでで登録処理確定 ############################# self.STR_Stat['Cope'] += len(wGetWords) #単語数を記録 ## ############################# ## # トゥートから時間を取得 ## wTime = CLS_OSIF.sGetTimeformat( inCreateAt ) ## if wTime['Result']==True : ## wTime = wTime['TimeDate'] ## else: ## wTime = None ## ############################# # 解読した結果(単語)を判定しながら詰めていく wKeylist = wGetWords.keys() #キーはIndex整数 wClazList = "" #文書パターン for wKey in wKeylist: ############################# # 登録済みの単語か wQuery = "word = '" + wGetWords[wKey]['word'] + "'" wDBRes = wOBJ_DB.RunExist("TBL_WORD_CORRECT", wQuery) wDBRes = wOBJ_DB.GetQueryStat() if wDBRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_WordCorr: WordStudy: Run Query is failed (Word check): " + wDBRes['Reason'] + " query=" + wDBRes['Query']) wOBJ_DB.Close() return False if wDBRes['Responce'] == True: ###登録済み ### 触れたので時刻を更新 wQuery = "update TBL_WORD_CORRECT set " + \ "lupdate = '" + str(gVal.STR_TimeInfo['TimeDate']) + "' " + \ "where word = '" + wGetWords[wKey]['word'] + "' ;" wDBRes = wOBJ_DB.RunQuery(wQuery) wDBRes = wOBJ_DB.GetQueryStat() if wDBRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_WordCorr: WordStudy: Run Query is failed (Word check, time update): " + wDBRes['Reason'] + " query=" + wDBRes['Query']) wOBJ_DB.Close() return False ###品詞パターンは記録する wClazList = wClazList + wGetWords[wKey]['claz'] + "," continue #登録済なのでスキップ ############################# # 除外する品詞か #### BOS/EOS if wGetWords[wKey]['claz'] == "BOS/EOS": continue #### 意識不明な単語、パターンとして使えない単語 if (wGetWords[wKey]['claz'] == "名詞" and wGetWords[wKey]['yomi'] == "*" and wGetWords[wKey]['cla1'] == "サ変接続" ) or \ (wGetWords[wKey]['claz'] == "名詞" and wGetWords[wKey]['cla1'] == "数" ) or \ wGetWords[wKey]['claz'] == "記号" : continue #### 名詞かつ 3文字以内の半角英字 if (wGetWords[wKey]['claz'] == "名詞" and wGetWords[wKey]['cla1'] == "一般" ) or \ (wGetWords[wKey]['claz'] == "名詞" and wGetWords[wKey]['cla1'] == "固有名詞" and wGetWords[wKey]['cla2'] == "組織" ) : wRes = CLS_OSIF.sRe_Search(r'^[a-zA-Z]+$', wGetWords[wKey]['word']) if wRes: if len(wGetWords[wKey]['word']) <= 3: continue #### 禁止ワードを含むか ## if self.CheckWordREM( wGetWords[wKey]['word'] )==False : if wGetWords[wKey]['word'] in gVal.STR_WordREM: continue #禁止あり ###**ループ中に辞書の登録上限を超えても何もしない仕様(DBだしええかと) ############################# # 単語の登録 wQuery = "insert into TBL_WORD_CORRECT values (" + \ "'" + wGetWords[wKey]['word'] + "'," + \ "'" + wGetWords[wKey]['claz'] + "'," + \ "'" + wGetWords[wKey]['yomi'] + "'," + \ "'" + wGetWords[wKey]['cla1'] + "'," + \ "'" + wGetWords[wKey]['cla2'] + "'," + \ "'" + wGetWords[wKey]['cla3'] + "'," + \ "'" + wGetWords[wKey]['ktyp'] + "'," + \ "'" + wGetWords[wKey]['kkat'] + "'," + \ "'" + str(gVal.STR_TimeInfo['TimeDate']) + "'," + \ "False " + \ ") ;" wDBRes = wOBJ_DB.RunQuery(wQuery) wDBRes = wOBJ_DB.GetQueryStat() if wDBRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_WordCorr: WordStudy: Run Query is failed (Word regist): " + wDBRes['Reason'] + " query=" + wDBRes['Query']) wOBJ_DB.Close() return False self.STR_Stat['Regist'] += 1 ###品詞パターンは記録する wClazList = wClazList + wGetWords[wKey]['claz'] + "," ############################# # 今回の学習回数更新 self.STR_Stat['StudyNum'] += 1 ############################# # 品詞パターン学習 if wClazList != "": wClazList = wClazList[0:len(wClazList) - 1] #末尾の','を抜く ###同じ品詞パターンがあるか wQuery = "claz = '" + wClazList + "'" wDBRes = wOBJ_DB.RunExist("TBL_CLAZ_LIST", wQuery) wDBRes = wOBJ_DB.GetQueryStat() if wDBRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_WordCorr: WordStudy: Run Query is failed (Claz check): " + wDBRes['Reason'] + " query=" + wDBRes['Query']) wOBJ_DB.Close() return False if wDBRes['Responce'] == True: ###登録済みならここで終わる(正常) wOBJ_DB.Close() return True ###登録なしなら、登録する ### **ここで品詞パターンの登録上限を超えても何もしない仕様(DBだしええかと) wQuery = "insert into TBL_CLAZ_LIST values (" + \ "'" + wClazList + "'," + \ "'" + str(gVal.STR_TimeInfo['TimeDate']) + "'," + \ "False " + \ ") ;" wDBRes = wOBJ_DB.RunQuery(wQuery) wDBRes = wOBJ_DB.GetQueryStat() if wDBRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_WordCorr: WordStudy: Run Query is failed (Claz regist): " + wDBRes['Reason'] + " query=" + wDBRes['Query']) wOBJ_DB.Close() return False self.STR_Stat['ClazList'] += 1 ############################# # 正常終了 wOBJ_DB.Close() return True
def GetRandToot(self): wToot = "" ############################# # ワード収集が有効か if gVal.STR_MasterConfig['WordStudy'] != "on": return wToot #無効 ############################# # DB接続 wOBJ_DB = CLS_PostgreSQL_Use(gVal.DEF_STR_FILE['DBinfo_File']) wRes = wOBJ_DB.GetIniStatus() if wRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_WordCorr: GetRandToot: DB Connect test is failed: " + wRes['Reason']) wOBJ_DB.Close() return wToot ############################# # 品詞パターンを取得 wQuery = "select claz from TBL_CLAZ_LIST order by random() limit 1" + \ ";" wDBRes = wOBJ_DB.RunQuery(wQuery) wDBRes = wOBJ_DB.GetQueryStat() if wDBRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_WordCorr: GetRandToot: Run Query is failed (get TBL_CLAZ_LIST): " + wDBRes['Reason'] + " query=" + wDBRes['Query']) wOBJ_DB.Close() return wToot if len(wDBRes['Responce']['Data']) != 1: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_WordCorr: GetRandToot: Run Query is failed (get TBL_CLAZ_LIST is not 1): " + wDBRes['Reason'] + " query=" + wDBRes['Query']) wOBJ_DB.Close() return wToot wSelClazList = wDBRes['Responce']['Data'][0][0] wClazList = wSelClazList.split(",") ############################# # 最適化用にパターンにある品詞をまとめこむ。 # ついで収集用にまとめ領域を作る。 wRandDic = {} wClazDic = {} wIndex = 0 for wClaz in wClazList: wKeyList = list(wClazDic.keys()) if wClaz not in wKeyList: wClazDic.update({wClaz: 1}) else: wClazDic[wClaz] += 1 wRandDic.update({wIndex: ""}) wRandDic[wIndex] = {} wRandDic[wIndex].update({"claz": wClaz}) wRandDic[wIndex].update({"word": ""}) wIndex += 1 ############################# # 品詞ごとにワードを収集する wKeyList = list(wClazDic.keys()) for wKey in wKeyList: wQuery = "select word from TBL_WORD_CORRECT where " + \ "claz = '" + wKey + "' order by random() limit " + str(wClazDic[wKey]) + \ ";" wDBRes = wOBJ_DB.RunQuery(wQuery) wDBRes = wOBJ_DB.GetQueryStat() if wDBRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_WordCorr: GetRandToot: Run Query is failed (get TBL_WORD_CORRECT is random select): " + wDBRes['Reason'] + " query=" + wDBRes['Query']) wOBJ_DB.Close() return wToot for wWord in wDBRes['Responce']['Data']: wRandList = wRandDic.keys() wFLG_Hit = False for wRandKey in wRandList: if wRandDic[wRandKey]['claz'] == wKey: wFLG_Hit = True break if wFLG_Hit == True: wRandDic[wRandKey]['word'] = wWord[0] ############################# # 使った品詞パターンを削除する wQuery = "delete from TBL_CLAZ_LIST where " + \ "claz = '" + wSelClazList + "'" + \ ";" wDBRes = wOBJ_DB.RunQuery(wQuery) wDBRes = wOBJ_DB.GetQueryStat() if wDBRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_WordCorr: GetRandToot: Run Query is failed (delete TBL_CLAZ_LIST): " + wDBRes['Reason'] + " query=" + wDBRes['Query']) wOBJ_DB.Close() return wToot ############################# # DB切断 wOBJ_DB.Close() ############################# # 文字列に組み立てる wToot = "" wRandList = wRandDic.keys() for wRandKey in wRandList: wToot = wToot + wRandDic[wRandKey]['word'] return wToot #成功
def Get_DBctrl_Twitter(self): ############################# # DB接続 wOBJ_DB = CLS_PostgreSQL_Use(gVal.DEF_STR_FILE['DBinfo_File']) wRes = wOBJ_DB.GetIniStatus() if wRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_TwitterReader: Get_DBctrl_Twitter: DB Connect test is failed: " + wRes['Reason']) wOBJ_DB.Close() return ############################# # 取り出し wQuery = "select * from TBL_TWITTER_READER ;" wRes = wOBJ_DB.RunQuery(wQuery) wRes = wOBJ_DB.GetQueryStat() if wRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_TwitterReader: Get_DBctrl_Twitter: Run Query is failed: " + wRes['Reason'] + " query=" + wRes['Query']) wOBJ_DB.Close() return if len(wRes['Responce']['Data']) == 0: ##トレンド情報なし self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_TwitterReader: Get_DBctrl_Twitter: TBL_TWITTER_READER record is 0" ) wOBJ_DB.Close() return ############################# # 一回ローカルに読み出す wARR_Twitter = {} wIndex = 0 for wLineTap in wRes['Responce']['Data']: ##領域の準備 wARR_Twitter.update({wIndex: ""}) wARR_Twitter[wIndex] = {} wARR_Twitter[wIndex].update({"id": 0}) wARR_Twitter[wIndex].update({"text": ""}) wARR_Twitter[wIndex].update({"screen_name": ""}) wARR_Twitter[wIndex].update({"send_user": ""}) wARR_Twitter[wIndex].update({"tags": ""}) wARR_Twitter[wIndex].update({"lupdate": ""}) wARR_Twitter[wIndex].update({"sended": False}) ##取り出し wGetTap = [] for wCel in wLineTap: wGetTap.append(wCel) ## [0] ..id ## [1] ..text ## [2] ..screen_name ## [3] ..send_user ## [4] ..tags ## [5] ..lupdate ## [6] ..sended ##領域へロード wARR_Twitter[wIndex]['id'] = int(wGetTap[0]) wARR_Twitter[wIndex]['text'] = wGetTap[1].strip() wARR_Twitter[wIndex]['screen_name'] = wGetTap[2].strip() wARR_Twitter[wIndex]['send_user'] = wGetTap[3].strip() wARR_Twitter[wIndex]['lupdate'] = wGetTap[5] wARR_Twitter[wIndex]['sended'] = wGetTap[6] wGetTap[4] = wGetTap[4].strip() if wGetTap[4] == "(none)": wGetTap[4] = "" # null設定 wARR_Twitter[wIndex]['tags'] = wGetTap[4] wIndex += 1 ############################# # DB切断 wOBJ_DB.Close() ############################# # 未送信のものを読みだす self.ARR_Twitter = {} wKeylist = wARR_Twitter.keys() wIndex = 0 for wKey in wKeylist: if wARR_Twitter[wKey]['sended'] == True: continue #送信済 if wARR_Twitter[wKey]['send_user'] != self.Obj_Parent.CHR_Account: continue #送信者ではない ############################# # 格納 self.ARR_Twitter.update({wIndex: ""}) self.ARR_Twitter[wIndex] = {} self.ARR_Twitter[wIndex].update({"id": wARR_Twitter[wKey]['id']}) self.ARR_Twitter[wIndex].update( {"text": wARR_Twitter[wKey]['text']}) self.ARR_Twitter[wIndex].update( {"screen_name": wARR_Twitter[wKey]['screen_name']}) self.ARR_Twitter[wIndex].update( {"send_user": wARR_Twitter[wKey]['send_user']}) self.ARR_Twitter[wIndex].update( {"tags": wARR_Twitter[wKey]['tags']}) self.ARR_Twitter[wIndex].update( {"lupdate": wARR_Twitter[wKey]['lupdate']}) self.ARR_Twitter[wIndex].update({"sended": False}) wIndex += 1 return
def Set_DBctrl_Twitter(self): ############################# # DB接続 wOBJ_DB = CLS_PostgreSQL_Use(gVal.DEF_STR_FILE['DBinfo_File']) wRes = wOBJ_DB.GetIniStatus() if wRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_TwitterReader: Set_DBctrl_Twitter: DB Connect test is failed: " + wRes['Reason']) wOBJ_DB.Close() return wKeyList = self.ARR_Twitter.keys() ############################# # ダブりがないかチェック # ・なければ追加 # ・あれば更新 for wKey in wKeyList: wQuery = "select * from TBL_TWITTER_READER where id = '" + self.ARR_Twitter[ wKey]['id'] + "' ;" wDBRes = wOBJ_DB.RunQuery(wQuery) wDBRes = wOBJ_DB.GetQueryStat() if wDBRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_TwitterReader: Set_DBctrl_Twitter: Run Query is failed: " + wDBRes['Reason'] + " query=" + wDBRes['Query']) wOBJ_DB.Close() return False wFLG_Update = False wText = str(self.ARR_Twitter[wKey]['text']).replace("'", "''") ############################# # クエリの作成 if self.ARR_Twitter[wKey]['tags'] == "": self.ARR_Twitter[wKey]['tags'] = "(none)" # SQL用補完 ###なければ追加 if len(wDBRes['Responce']['Data']) == 0: wQuery = "insert into TBL_TWITTER_READER values (" + \ str( self.ARR_Twitter[wKey]['id'] ) + "," + \ "'" + wText + "'," + \ "'" + self.ARR_Twitter[wKey]['screen_name'] + "'," + \ "'" + self.ARR_Twitter[wKey]['send_user'] + "'," + \ "'" + self.ARR_Twitter[wKey]['tags'] + "'," + \ "'" + self.ARR_Twitter[wKey]['lupdate'] + "'," + \ str( self.ARR_Twitter[wKey]['sended'] ) + " " + \ ") ;" ###あれば更新 else: wChgList = [] if wOBJ_DB.ChgList(wDBRes['Responce']['Data'], outList=wChgList) != True: ##ないケースかも self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_UserCorr: AddUser: Select data is Zero") wOBJ_DB.Close() return False wChgList = wChgList[0] #1行しかないし切る wQuery = "update TBL_TWITTER_READER set " + \ "text = '" + wText + "', " + \ "screen_name = '" + str(self.ARR_Twitter[wKey]['screen_name']) + "', " + \ "send_user = '******'send_user']) + "', " + \ "tags = '" + str(self.ARR_Twitter[wKey]['tags']) + "', " + \ "lupdate = '" + str(self.ARR_Twitter[wKey]['lupdate']) + "', " + \ "sended = " + str(self.ARR_Twitter[wKey]['sended']) + " " + \ "where id = '" + wChgList[0] + "' ;" wFLG_Update = True ############################# # クエリ実行 wDBRes = wOBJ_DB.RunQuery(wQuery) wDBRes = wOBJ_DB.GetQueryStat() if wDBRes['Result'] != True: ##失敗 self.Obj_Parent.OBJ_Mylog.Log( 'a', "CLS_UserCorr: AddUser: DB insert is failed: " + wDBRes['Reason'] + " query=" + wDBRes['Query']) wOBJ_DB.Close() return False ############################# # カウント if wFLG_Update == True: self.STR_Cope['Update'] += 1 else: self.STR_Cope['Insert'] += 1 ############################# # 正常終了 wOBJ_DB.Close() return