精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

企業(yè)微信API調(diào)用實戰(zhàn):Java/Go/Python高效發(fā)群消息

發(fā)布于 2025-11-21 15:03
瀏覽
0收藏

Java/Go/Python 調(diào)用企微API主動發(fā)送外部群消息:核心技巧+避坑指南

企業(yè)微信外部群消息推送是ToB業(yè)務(wù)觸達客戶的核心場景,但企微API對權(quán)限、格式、頻率都有嚴格限制,不同語言開發(fā)時還會遇到各自的適配問題。本文結(jié)合實戰(zhàn)經(jīng)驗,拆解Java/Go/Python三種主流語言調(diào)用企微API主動發(fā)外部群消息的核心技巧、通用避坑點,以及各語言專屬優(yōu)化方案。

一、通用前置:企微API發(fā)外部群消息的核心前提

無論用哪種語言,先搞定這3個基礎(chǔ)(踩坑重災(zāi)區(qū)):

1. 權(quán)限與身份驗證

  • 必須具備的權(quán)限
    • 應(yīng)用需開啟“客戶聯(lián)系-外部群聊”權(quán)限(企微管理后臺→應(yīng)用管理→自建應(yīng)用→權(quán)限配置);
    • 發(fā)送賬號需是外部群的“群主/群管理員”,且應(yīng)用已授權(quán)該賬號的“外部聯(lián)系讀寫權(quán)限”;
    • 外部群需是“客戶群”(普通外部群無法通過API推送,需通過企微客戶端/客戶聯(lián)系能力創(chuàng)建)。
  • AccessToken獲取
    所有API調(diào)用依賴access_token(有效期2小時),需單獨維護緩存(禁止每次請求都獲取,企微限制接口調(diào)用頻率),失效后重新調(diào)用https://qyapi.weixin.qq.com/cgi-bin/gettoken獲取。

2. 消息格式規(guī)范

  • 支持類型:文本、圖片、鏈接、小程序、模板消息等(外部群不支持視頻/文件等大附件);
  • 核心參數(shù):
    • chatid:外部群唯一標識(需通過獲取外部群列表接口獲取,禁止手動拼接/猜測);
    • msgtype:消息類型(如text/link);
    • agentid:自建應(yīng)用的AgentID(需與access_token對應(yīng))。

3. 頻率限制

  • 單應(yīng)用單日發(fā)送外部群消息上限:默認2000條(可在企微管理后臺提升,但需審核);
  • 單群每分鐘最多推送5條消息,避免觸發(fā)限流(返回429錯誤)。

二、各語言實戰(zhàn)技巧+代碼示例

(一)Java:高可用+批量推送優(yōu)化

Java多用于企業(yè)級后臺,重點解決“高并發(fā)、重試、批量處理”問題。

核心技巧

  1. 封裝通用HTTP客戶端:用OkHttp/HttpClient替代原生URLConnection,配置超時、重試(企微API偶發(fā)500,建議重試2次);
  2. AccessToken緩存:用Guava Cache/Redis緩存,設(shè)置1小時50分鐘過期(預(yù)留刷新時間);
  3. 批量處理chatid:外部群數(shù)量多時,用線程池異步推送(核心線程數(shù)≤10,避免觸發(fā)頻率限制);
  4. 異常捕獲:重點捕獲400(參數(shù)錯誤)、401(token失效)、429(限流),分別處理(401自動刷新token,429延遲重試)。

實戰(zhàn)代碼(Spring Boot環(huán)境)

import okhttp3.*;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;

@Component
public class WxWorkMsgSender {
    // 緩存access_token(生產(chǎn)環(huán)境替換為Redis/Guava Cache)
    private String accessToken;
    private long tokenExpireTime;

    // 初始化OkHttp客戶端(全局單例)
    private final OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .readTimeout(10, TimeUnit.SECONDS)
            .retryOnConnectionFailure(true)
            .build();

    // 獲取AccessToken(帶緩存)
    private String getValidAccessToken() {
        long now = System.currentTimeMillis();
        if (accessToken == null || now > tokenExpireTime) {
            // 調(diào)用企微gettoken接口,此處省略實現(xiàn)
            accessToken = fetchTokenFromWxWork();
            tokenExpireTime = now + 70 * 60 * 1000; // 70分鐘過期
        }
        return accessToken;
    }

    // 發(fā)送外部群文本消息
    public boolean sendExternalGroupMsg(String chatId, String content) {
        String url = "https://qyapi.weixin.qq.com/cgi-bin/appchat/send?access_token=" + getValidAccessToken();
        
        // 構(gòu)建消息體
        JSONObject msgJson = new JSONObject();
        msgJson.put("chatid", chatId);
        msgJson.put("msgtype", "text");
        JSONObject textContent = new JSONObject();
        textContent.put("content", content);
        msgJson.put("text", textContent);
        msgJson.put("agentid", 1000002); // 替換為你的AgentID

        // 構(gòu)建請求
        Request request = new Request.Builder()
                .url(url)
                .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), msgJson.toJSONString()))
                .build();

        try (Response response = okHttpClient.newCall(request).execute()) {
            String respBody = response.body().string();
            JSONObject respJson = JSONObject.parseObject(respBody);
            if (respJson.getInteger("errcode") == 0) {
                return true;
            } else {
                // 處理異常:401刷新token重試,429延遲重試
                int errCode = respJson.getInteger("errcode");
                if (errCode == 401) {
                    accessToken = null; // 清空緩存,下次自動刷新
                    return sendExternalGroupMsg(chatId, content); // 重試1次
                } else if (errCode == 429) {
                    TimeUnit.SECONDS.sleep(2); // 延遲2秒重試
                    return sendExternalGroupMsg(chatId, content);
                }
                System.err.println("發(fā)送失敗:" + respJson.getString("errmsg"));
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    // 實際調(diào)用企微gettoken接口的方法(需替換corpid和corpsecret)
    private String fetchTokenFromWxWork() {
        String corpid = "你的企業(yè)ID";
        String corpsecret = "你的應(yīng)用秘鑰";
        String tokenUrl = String.format("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s", corpid, corpsecret);
        Request request = new Request.Builder().url(tokenUrl).get().build();
        try (Response response = okHttpClient.newCall(request).execute()) {
            String respBody = response.body().string();
            JSONObject respJson = JSONObject.parseObject(respBody);
            return respJson.getString("access_token");
        } catch (Exception e) {
            throw new RuntimeException("獲取AccessToken失敗", e);
        }
    }
}

Java專屬避坑

  • 避免用System.out打印日志,用SLF4J記錄異常(方便排查線上問題);
  • 消息體中agentid需為整型(別傳字符串,否則返回400錯誤);
  • 高并發(fā)場景下,AccessToken刷新需加鎖(避免多線程重復(fù)請求)。

(二)Go:輕量+高性能優(yōu)化

Go適合做輕量網(wǎng)關(guān)/定時推送服務(wù),重點利用協(xié)程+通道控制并發(fā),減少資源占用。

核心技巧

  1. 協(xié)程池控制并發(fā):用sync.WaitGroup+通道限制并發(fā)數(shù)(比如最多20個協(xié)程同時推送),避免觸發(fā)企微限流;
  2. AccessToken緩存:用sync.Map+定時器自動刷新(無需手動判斷過期);
  3. JSON序列化優(yōu)化:用encoding/json的結(jié)構(gòu)體替代map,減少序列化開銷;
  4. 超時控制:用context.WithTimeout給每個請求設(shè)置超時(避免阻塞協(xié)程)。

實戰(zhàn)代碼

package main

import (
	"context"
	"encoding/json"
	"fmt"
	"net/http"
	"sync"
	"time"
)

// 全局AccessToken緩存
var (
	tokenCache struct {
		sync.RWMutex
		token     string
		expiresAt time.Time
	}
	client = &http.Client{Timeout: 10 * time.Second}
)

// 企微API響應(yīng)結(jié)構(gòu)體
type WxWorkResp struct {
	Errcode int    `json:"errcode"`
	Errmsg  string `json:"errmsg"`
}

// 文本消息結(jié)構(gòu)體
type TextMsg struct {
	Chatid  string `json:"chatid"`
	Msgtype string `json:"msgtype"`
	Agentid int    `json:"agentid"`
	Text    struct {
		Content string `json:"content"`
	} `json:"text"`
}

// 獲取有效的AccessToken
func getAccessToken() (string, error) {
	tokenCache.RLock()
	if time.Now().Before(tokenCache.expiresAt) {
		token := tokenCache.token
		tokenCache.RUnlock()
		return token, nil
	}
	tokenCache.RUnlock()

	// 加寫鎖刷新token
	tokenCache.Lock()
	defer tokenCache.Unlock()
	// 雙重檢查,避免多協(xié)程重復(fù)刷新
	if time.Now().Before(tokenCache.expiresAt) {
		return tokenCache.token, nil
	}

	// 調(diào)用企微gettoken接口
	corpid := "你的企業(yè)ID"
	corpsecret := "你的應(yīng)用秘鑰"
	url := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s", corpid, corpsecret)
	resp, err := client.Get(url)
	if err != nil {
		return "", fmt.Errorf("獲取token失敗:%v", err)
	}
	defer resp.Body.Close()

	var tokenResp struct {
		Errcode     int    `json:"errcode"`
		Errmsg      string `json:"errmsg"`
		AccessToken string `json:"access_token"`
		ExpiresIn   int    `json:"expires_in"`
	}
	if err := json.NewDecoder(resp.Body).Decode(&tokenResp); err != nil {
		return "", fmt.Errorf("解析token響應(yīng)失敗:%v", err)
	}
	if tokenResp.Errcode != 0 {
		return "", fmt.Errorf("企微返回錯誤:%s", tokenResp.Errmsg)
	}

	// 更新緩存(過期時間減10分鐘,預(yù)留緩沖)
	tokenCache.token = tokenResp.AccessToken
	tokenCache.expiresAt = time.Now().Add(time.Duration(tokenResp.ExpiresIn-600) * time.Second)
	return tokenResp.AccessToken, nil
}

// 發(fā)送外部群消息(帶上下文超時)
func sendExternalGroupMsg(ctx context.Context, chatId, content string) bool {
	token, err := getAccessToken()
	if err != nil {
		fmt.Printf("獲取token失敗:%v\n", err)
		return false
	}

	url := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/appchat/send?access_token=%s", token)
	msg := TextMsg{
		Chatid:  chatId,
		Msgtype: "text",
		Agentid: 1000002, // 替換為你的AgentID
	}
	msg.Text.Content = content

	// 序列化消息體
	msgBytes, err := json.Marshal(msg)
	if err != nil {
		fmt.Printf("序列化消息失敗:%v\n", err)
		return false
	}

	// 構(gòu)建請求(帶上下文超時)
	req, err := http.NewRequestWithContext(ctx, "POST", url, bytes.NewBuffer(msgBytes))
	if err != nil {
		fmt.Printf("構(gòu)建請求失敗:%v\n", err)
		return false
	}
	req.Header.Set("Content-Type", "application/json; charset=utf-8")

	resp, err := client.Do(req)
	if err != nil {
		fmt.Printf("發(fā)送請求失敗:%v\n", err)
		return false
	}
	defer resp.Body.Close()

	var wxResp WxWorkResp
	if err := json.NewDecoder(resp.Body).Decode(&wxResp); err != nil {
		fmt.Printf("解析響應(yīng)失敗:%v\n", err)
		return false
	}

	if wxResp.Errcode == 0 {
		return true
	}
	// 處理429限流:延遲重試(最多1次)
	if wxResp.Errcode == 429 {
		time.Sleep(2 * time.Second)
		return sendExternalGroupMsg(ctx, chatId, content)
	}
	fmt.Printf("發(fā)送失敗:%s(code:%d)\n", wxResp.Errmsg, wxResp.Errcode)
	return false
}

// 批量發(fā)送(控制并發(fā)數(shù))
func batchSend(chatIds []string, content string, maxConcurrency int) {
	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	ch := make(chan string, maxConcurrency)
	var wg sync.WaitGroup

	// 啟動協(xié)程池
	for i := 0; i < maxConcurrency; i++ {
		go func() {
			for chatId := range ch {
				sendExternalGroupMsg(ctx, chatId, content)
				wg.Done()
			}
		}()
	}

	// 分發(fā)任務(wù)
	for _, chatId := range chatIds {
		wg.Add(1)
		ch <- chatId
	}
	close(ch)
	wg.Wait()
}

func main() {
	// 示例:批量發(fā)送給5個外部群,最大并發(fā)5
	chatIds := []string{"chat123456", "chat789012"}
	batchSend(chatIds, "【通知】企業(yè)服務(wù)升級提醒", 5)
}

Go專屬避坑

  • 協(xié)程池并發(fā)數(shù)別太高(建議≤20),否則容易觸發(fā)企微IP限流;
  • 上下文超時要合理(避免短任務(wù)超時,長任務(wù)阻塞);
  • 序列化時注意結(jié)構(gòu)體字段首字母大寫(否則無法序列化)。

(三)Python:快速開發(fā)+腳本化優(yōu)化

Python適合寫臨時推送腳本/輕量定時任務(wù),重點簡化代碼、提升開發(fā)效率。

核心技巧

  1. 用requests庫簡化HTTP請求:配合requests.Session復(fù)用連接,減少握手開銷;
  2. AccessToken緩存:用functools.lru_cache或本地文件緩存(腳本場景);
  3. 異常處理簡化:用try-except捕獲常見錯誤(連接超時、JSON解析失敗);
  4. 批量推送用異步:用aiohttp替代requests,提升批量發(fā)送效率(腳本場景)。

實戰(zhàn)代碼(異步版)

import aiohttp
import asyncio
import json
import time
from functools import lru_cache

# 配置項
CORPID = "你的企業(yè)ID"
CORPSECRET = "你的應(yīng)用秘鑰"
AGENTID = 1000002
MAX_RETRY = 1  # 最大重試次數(shù)
CONCURRENCY = 5  # 異步并發(fā)數(shù)

# 緩存AccessToken(lru_cache默認按參數(shù)緩存,此處無參數(shù),緩存全局)
@lru_cache(maxsize=1)
def get_access_token():
    """獲取AccessToken(緩存70分鐘)"""
    url = f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORPID}&corpsecret={CORPSECRET}"
    try:
        resp = aiohttp.ClientSession().get(url, timeout=10)
        resp_json = resp.json()
        if resp_json["errcode"] != 0:
            raise Exception(f"獲取token失敗:{resp_json['errmsg']}")
        # 記錄緩存時間,70分鐘后失效
        token = resp_json["access_token"]
        # 用lru_cache的過期機制(此處簡單處理,實際可加時間判斷)
        asyncio.get_event_loop().call_later(70*60, lambda: get_access_token.cache_clear())
        return token
    except Exception as e:
        print(f"獲取AccessToken異常:{e}")
        raise

async def send_external_group_msg(session, chat_id: str, content: str, retry=0):
    """異步發(fā)送外部群消息"""
    if retry > MAX_RETRY:
        print(f"[{chat_id}] 重試次數(shù)耗盡,發(fā)送失敗")
        return False
    
    try:
        token = get_access_token()
        url = f"https://qyapi.weixin.qq.com/cgi-bin/appchat/send?access_token={token}"
        msg = {
            "chatid": chat_id,
            "msgtype": "text",
            "agentid": AGENTID,
            "text": {"content": content}
        }
        async with session.post(url, json=msg, timeout=10) as resp:
            resp_json = await resp.json()
            if resp_json["errcode"] == 0:
                print(f"[{chat_id}] 發(fā)送成功")
                return True
            elif resp_json["errcode"] == 429:
                # 限流,延遲1秒重試
                print(f"[{chat_id}] 觸發(fā)限流,重試第{retry+1}次")
                await asyncio.sleep(1)
                return await send_external_group_msg(session, chat_id, content, retry+1)
            elif resp_json["errcode"] == 401:
                # token失效,清空緩存重試
                get_access_token.cache_clear()
                return await send_external_group_msg(session, chat_id, content, retry+1)
            else:
                print(f"[{chat_id}] 發(fā)送失敗:{resp_json['errmsg']}(code:{resp_json['errcode']})")
                return False
    except Exception as e:
        print(f"[{chat_id}] 發(fā)送異常:{e},重試第{retry+1}次")
        await asyncio.sleep(1)
        return await send_external_group_msg(session, chat_id, content, retry+1)

async def batch_send(chat_ids: list, content: str):
    """批量發(fā)送(控制并發(fā)數(shù))"""
    # 創(chuàng)建異步session(復(fù)用連接)
    async with aiohttp.ClientSession() as session:
        # 限制并發(fā)數(shù)
        semaphore = asyncio.Semaphore(CONCURRENCY)
        tasks = []
        for chat_id in chat_ids:
            # 用信號量控制并發(fā)
            task = asyncio.create_task(
                send_with_semaphore(semaphore, session, chat_id, content)
            )
            tasks.append(task)
        # 等待所有任務(wù)完成
        await asyncio.gather(*tasks)

async def send_with_semaphore(sem, session, chat_id, content):
    """帶信號量的發(fā)送函數(shù)"""
    async with sem:
        await send_external_group_msg(session, chat_id, content)

if __name__ == "__main__":
    # 示例:發(fā)送給多個外部群
    chat_ids = ["chat123456", "chat789012"]
    content = "【溫馨提示】本周服務(wù)升級,如有問題請聯(lián)系客服"
    # 運行異步任務(wù)
    asyncio.run(batch_send(chat_ids, content))

Python專屬避坑

  • 異步場景下避免混用同步代碼(比如requests和aiohttp),否則會阻塞事件循環(huán);
  • lru_cache緩存token時,注意清理機制(避免過期token一直緩存);
  • 腳本運行時注意編碼(中文內(nèi)容需確保UTF-8,避免亂碼)。

三、通用避坑終極清單

  1. chatid獲取錯誤
    • 外部群chatid需通過https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/list接口獲取,不能用群聊名稱/群號替代
    • 外部群解散/遷移后,chatid失效,需及時更新。
  2. 消息內(nèi)容違規(guī)
    • 避免含敏感詞(廣告、違規(guī)營銷內(nèi)容),否則消息會被攔截(無返回錯誤,但群內(nèi)收不到);
    • 文本消息長度≤2048字,超出會返回400錯誤。
  3. 權(quán)限穿透問題
    • 應(yīng)用需綁定到“客戶聯(lián)系”功能模塊,否則無法調(diào)用外部群接口;
    • 發(fā)送賬號需在企微客戶端登錄過,且未被禁用“外部聯(lián)系”權(quán)限。
  4. 跨企業(yè)推送限制
    • 僅能推送本企業(yè)創(chuàng)建的外部群,無法推送其他企業(yè)創(chuàng)建的外部群(即使是群成員)。
  5. 調(diào)試技巧

四、進階優(yōu)化建議

  1. 消息模板化:將常用消息(通知、活動)封裝為模板,避免硬編碼內(nèi)容;
  2. 推送記錄落地:記錄每個chatid的推送時間、內(nèi)容、結(jié)果(數(shù)據(jù)庫/日志),便于排查問題;
  3. 限流降級:當觸發(fā)429錯誤時,自動降低推送頻率(比如從5條/分鐘降到3條/分鐘);
  4. 監(jiān)控告警:對接Prometheus/Grafana,監(jiān)控token失效、推送失敗率、限流次數(shù),異常時告警。

無論用哪種語言,核心都是“先滿足企微API的規(guī)則,再結(jié)合語言特性優(yōu)化性能和可維護性”。新手建議先從單條消息推送入手,驗證通過后再做批量、異步優(yōu)化。

收藏
回復(fù)
舉報
回復(fù)
相關(guān)推薦
国产一区二区精品| 91成人在线| 不卡视频在线观看| 欧洲成人午夜免费大片| 色屁屁草草影院ccyy.com| 欧美aaaaaa| 亚洲第一搞黄网站| 日韩激情视频| 精品人妻av一区二区三区| 99精品欧美| 中文字幕精品在线| 妖精视频在线观看| 免费成人动漫| 一区二区欧美精品| 日韩美女一区| 理论片中文字幕| 久久91精品国产91久久小草| 久久久亚洲影院你懂的| 亚洲黄色免费视频| 2021年精品国产福利在线| 91久久奴性调教| 日韩小视频网站| av基地在线| 99re这里都是精品| 亚洲字幕一区二区| 男操女视频网站| 亚洲区第一页| 欧美wwwxxxx| 在线观看亚洲大片短视频| 国偷自产视频一区二区久| 91精品久久久久久久99蜜桃| 黄色高清无遮挡| а√在线中文在线新版| 亚洲精品综合在线| 一区二区三区四区国产| 欧美美女色图| av一区二区三区| 91传媒视频在线观看| 在线观看国产黄| 久久国产欧美| 91国产在线精品| 久久久久亚洲av无码专区| 久久国产精品亚洲人一区二区三区| 亚洲黄页网在线观看| 久久无码人妻一区二区三区| 欧美高清xxx| 欧美午夜精品一区| 成人亚洲视频在线观看| 中文字幕在线视频网站| 亚洲国产成人porn| 欧美日韩中文字幕在线播放| 色影院视频在线| 中文av一区二区| 日本精品视频一区| 狠狠色伊人亚洲综合网站l| 97久久超碰国产精品| 国产综合欧美在线看| 欧美熟女一区二区| 成人免费高清视频| 国产精品乱子乱xxxx| 国产综合无码一区二区色蜜蜜| 国产精品中文字幕日韩精品| 91日本在线观看| 国产高清在线观看视频| 国产成人午夜精品5599 | 久久久国产精华液| 国产一区欧美| 性色av一区二区三区在线观看| 国产亚洲色婷婷久久99精品| 影音先锋亚洲一区| 91极品视频在线| 青青草免费观看视频| 免费日韩一区二区| 国产精品国产三级国产专播精品人 | 亚洲最大的成人av| 国产va亚洲va在线va| www.51av欧美视频| 91久久精品日日躁夜夜躁欧美| 日本爱爱免费视频| 大胆国模一区二区三区| 精品国产乱码久久久久久免费| 日韩综合第一页| 国产精品欧美三级在线观看| 日韩一区av在线| 日韩黄色免费观看| 亚洲伦伦在线| 国产精品久久久久久av| 国产特级黄色片| 成人天堂资源www在线| 久久久亚洲综合网站| wwwww在线观看免费视频| 亚洲日本在线观看| 亚洲自拍偷拍麻豆| 91视频成人免费| missav|免费高清av在线看| 黑人巨大精品欧美一区二区一视频| 日本va中文字幕| 亚洲三级电影| 日韩av有码在线| 国产精品理论在线| 影音先锋中文字幕一区| 国产精品v日韩精品| 国产免费黄色片| 26uuu亚洲综合色| 精品国产无码在线| 亚洲精品mv| 日韩欧美国产高清| 亚洲一区二区三区日韩| 欧美精品福利| 国产精品久久色| 天堂8在线视频| 国产精品国产三级国产三级人妇 | 久热国产在线| 精品动漫一区二区| 久久精品视频在线观看免费| 亚洲精品推荐| 欧美国产极速在线| 最近中文字幕在线免费观看| 成人久久视频在线观看| 亚洲一区二区精品在线观看| 新版的欧美在线视频| 日韩一级大片在线| 少妇太紧太爽又黄又硬又爽小说| 狠狠爱成人网| 91在线观看免费观看| 国产视频网站在线| 欧美日韩精品在线视频| 丰满少妇一区二区三区专区| 欧美国产美女| 热99久久精品| 五月天激情婷婷| 亚洲欧美日韩在线| 性chinese极品按摩| 色婷婷久久久| 久久久久国产视频| 国产三级视频在线播放| 欧美国产精品久久| 免费在线观看的毛片| 露出调教综合另类| 久久久免费精品| 99er热精品视频| 日韩码欧中文字| 99视频在线视频| 国产传媒欧美日韩成人精品大片| 91精品国产高清久久久久久久久 | 日本三级视频在线| 国产宾馆实践打屁股91| 国产911在线观看| 精品三级国产| 久久国产精品久久久久久久久久 | 亚洲福利视频久久| 成人免费看片98| 成人av电影在线| 国产真人做爰毛片视频直播| 国产精品玖玖玖在线资源| 欧美激情三级免费| 亚洲经典一区二区三区| 亚洲一区二区欧美激情| www.17c.com喷水少妇| 精品动漫3d一区二区三区免费版 | 自拍视频在线观看一区二区| 老司机午夜性大片| 国产精品88久久久久久| 成人午夜黄色影院| 亚洲性图自拍| 欧美精品一区二区三区在线播放 | 欧美视频在线一区| 亚洲激情图片网| 精品一区二区三区视频| 9191国产视频| 国产香蕉精品| 日韩免费观看视频| 色大18成网站www在线观看| 欧美一区二区三区的| 久久久无码精品亚洲国产| 99久久精品99国产精品| 丁香啪啪综合成人亚洲| 婷婷综合伊人| 国产免费一区二区| 国产精品扒开腿做爽爽爽视频软件| 伊人一区二区三区久久精品| 99久久精品日本一区二区免费| 夜夜精品视频一区二区| 亚洲天堂久久新| 精品中文字幕一区二区小辣椒| 大地资源网在线观看免费官网| 欧美一级色片| 国产精品免费福利| 色婷婷av在线| 亚洲欧美日韩精品久久亚洲区| 中文区中文字幕免费看| 亚洲黄色在线视频| 精品人妻少妇嫩草av无码| 久久电影网电视剧免费观看| 免费网站永久免费观看| 精品国产中文字幕第一页| 亚洲一区二区日本| 国产伦精品一区二区三区视频金莲| 日韩亚洲综合在线| 午夜av免费在线观看| 欧美日韩免费一区二区三区视频| 久久国产露脸精品国产| 国产亚洲1区2区3区| 久久久久无码国产精品一区李宗瑞 | 国产中文字幕二区| 99精品综合| 久久99欧美| 成人影院网站ww555久久精品| 97超碰国产精品女人人人爽| 香蕉视频国产在线观看| 亚洲精品成人久久| 国产福利资源在线| 欧美日韩在线播放三区| 成年人免费看毛片| 亚洲码国产岛国毛片在线| 偷拍女澡堂一区二区三区| 国产一区999| 污污的网站免费| 久久一区视频| 日韩中字在线观看| 这里只有精品在线| 一级做a爰片久久| 亚洲精华一区二区三区| 国产精品一区二区欧美黑人喷潮水| 免费日韩成人| 国产精品爱久久久久久久| 午夜欧美激情| 国内精品久久久久久影视8| 91麻豆免费在线视频| 中文字幕一区二区三区电影| 少妇高潮一区二区三区69| 日韩一级大片在线观看| 国产农村妇女毛片精品| 欧美视频在线观看一区二区| 中文字幕免费观看| 欧美性色视频在线| 日韩三级视频在线播放| 亚洲va在线va天堂| 国产在线成人精品午夜| 亚洲一区二区三区影院| 欧美日韩在线国产| 亚洲黄色小视频| 国产va在线播放| 亚洲日本丝袜连裤袜办公室| 女人裸体性做爰全过| 中文字幕成人av| 国产又黄又粗的视频| 国产免费成人在线视频| 欧美人妻一区二区三区| 久久精品无码一区二区三区| 成人性生交大免费看| 久久亚洲春色中文字幕久久久| 国产精品一级黄片| www.色综合.com| 日韩av手机在线播放| av在线综合网| 熟女人妻在线视频| 久久众筹精品私拍模特| 日韩精品无码一区二区三区久久久| 久久综合色鬼综合色| 一区二区黄色片| 日本一区二区免费在线 | 少妇高潮一区二区三区69| 日韩h在线观看| 欧美一区二区少妇| 国产亚洲精品va在线观看| 成人精品一区二区三区免费| 最近2019中文免费高清视频观看www99 | 成人免费三级在线| 91精品小视频| 国产日韩成人精品| 亚洲区一区二区三| 一区二区免费在线播放| 国产在线观看黄色| 欧美无乱码久久久免费午夜一区 | 亚洲第一网站男人都懂| 亚洲日本中文字幕在线| 精品丝袜一区二区三区| 岛国在线大片| 欧美精品亚州精品| 韩日成人影院| 91亚洲精华国产精华| 国产一区二区三区亚洲| 欧洲久久久久久| 亚洲精品国产成人影院| 国产69精品久久久久久久| 日本成人在线视频网站| 无码国产精品久久一区免费| 99精品偷自拍| 欧美视频一区二区在线| 亚洲成a人v欧美综合天堂下载| 国产亚洲欧美日韩高清| 日韩欧美一区电影| 久草在现在线| 欧美激情综合亚洲一二区| 成人午夜精品| 国产精品二区三区| 日韩亚洲一区在线| 日韩中字在线观看| 国精品**一区二区三区在线蜜桃 | 精品久久ai| 一区二区不卡视频| 国产日韩一区| 亚洲高清av一区二区三区| 久久人人97超碰com| 我家有个日本女人| 欧美影院午夜播放| 亚洲av成人精品一区二区三区在线播放| 中文字幕日韩综合av| 国产精品vvv| 亚洲一区二区日本| 国产一区二区三区日韩精品| 岛国大片在线播放| 狠狠v欧美v日韩v亚洲ⅴ| 精品人伦一区二区三电影| 亚洲一二三区在线观看| 91影院在线播放| 亚洲欧美在线免费| 国产传媒在线| 国产91亚洲精品一区二区三区| 天天射天天综合网| 国产一二三四在线视频| 91视视频在线直接观看在线看网页在线看| 黄色香蕉视频在线观看| 91黄视频在线| 久久精品色图| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲网一区二区三区| 波多野结衣激情| 捆绑变态av一区二区三区| brazzers精品成人一区| 亚洲成a人片在线不卡一二三区| www.国产黄色| 欧美成人免费小视频| 青青青国产精品| 四虎永久国产精品| 日韩成人伦理电影在线观看| 黄色工厂在线观看| 欧美日韩精品在线观看| 天天操天天操天天干| 久久久久久久久久久久av| 91成人在线精品视频| 国产又粗又长又爽视频| 国产精品白丝jk白祙喷水网站 | 深夜福利视频在线观看| 97精品在线观看| 欧美电影完整版在线观看| 波多野结衣家庭教师在线| 97久久人人超碰| 天天干天天干天天| 亚洲欧美日韩国产中文| 奇米777日韩| 色综合视频二区偷拍在线 | 国产无套精品一区二区三区| 一区二区三区在线影院| 午夜精品久久久久久久96蜜桃| 久久久久久com| 国产在线播放精品| 中国丰满人妻videoshd | 蜜桃免费网站一区二区三区| 日韩在线一卡二卡| 欧美xxxx在线观看| 女人高潮被爽到呻吟在线观看 | 香蕉视频污视频| 欧美日韩激情美女| 春暖花开成人亚洲区| 91在线视频成人| 国产一区二区三区四区老人| 亚洲最大免费视频| 欧洲精品中文字幕| 蜜芽在线免费观看| 国产精品成人一区二区三区| 亚洲综合精品| 99久久99久久精品免费看小说.| 在线播放91灌醉迷j高跟美女| 男女免费观看在线爽爽爽视频| 久久久精品国产一区二区三区| 日韩电影在线观看电影| 一级性生活免费视频| 欧美精品一区二区蜜臀亚洲| 美脚恋feet久草欧美| 午夜啪啪福利视频| av亚洲精华国产精华精华| 性高潮视频在线观看| 欧美精品制服第一页| 欧美激情极品| 成年人三级黄色片| 婷婷六月综合亚洲| av男人的天堂在线| 精品国产乱码久久久久久丨区2区| 丝袜诱惑制服诱惑色一区在线观看 | 99国产精品久久久久久久成人| 国模吧一区二区三区| 欧美日一区二区| 最新国产精品自拍| 欧美日韩在线电影| 亚洲天堂资源| 国产91在线亚洲| 欧美极品美女视频| 五月婷婷伊人网|