精品欧美一区二区三区在线观看 _久久久久国色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)推薦
www日韩大片| 国产成人avxxxxx在线看| 中国成人一区| 国产尤物在线视频| 日本精品视频在线| 国产精品亚洲专一区二区三区 | 国产伦理在线观看| 亚洲精品久久久久| 欧美激情 亚洲a∨综合| 无码人妻一区二区三区免费| 99久久自偷自偷国产精品不卡| 国产日韩精品视频一区| 日本乱理伦在线| 日韩中文字幕a| 亚洲欧美精品一区二区| 激情久久婷婷| 黄色一级大片在线免费看国产一| 亚洲国产一区二区三区在线| 午夜欧美一区二区三区在线播放| 欧美国产中文高清| 成年人网站在线观看视频| 日本视频久久久| av电影天堂一区二区在线观看| 国产乱色在线观看| 日韩成人精品视频在线观看| 日韩中文字幕在线免费观看| 久久日文中文字幕乱码| 精品无码一区二区三区电影桃花| 亚洲aⅴ男人的天堂在线观看| 国产精品入口麻豆九色| 主播大秀视频在线观看一区二区| 国产熟妇久久777777| 国产91精品久久久久| 久久久不卡影院| 51一区二区三区| 九九热国产精品视频| 国产高清在线精品一区二区三区| 一区二区三区在线视频免费观看 | 久久伊人蜜桃av一区二区| 免费高潮视频95在线观看网站| 日批在线观看视频| 浅井舞香一区二区| 最新日韩av在线| 国语一区二区三区| 成人免费毛片男人用品| 国产aⅴ精品一区二区三区黄| 亚洲成a天堂v人片| 九九热线有精品视频99| 一级黄色大片网站| 欧美视频在线免费播放| 在线日韩日本国产亚洲| 国产成人aaa| 欧美特黄色片| 日韩人妻精品中文字幕| 欧美做受777cos| 在线观看亚洲区| 99久久精品国产导航| 日韩成人免费av| 亚洲黄网在线观看| 日本香蕉视频在线观看| 最新国产成人av网站网址麻豆| 丁香六月综合激情| 国产亚洲观看| 亚洲国产精品久久人人爱潘金莲| 欧美高清性xxxxhdvideosex| 91久久线看在观草草青青| 中文字幕人成人乱码| 国际av在线| 中文成人无字幕乱码精品区| 亚洲一区二区在线播放| 欧美私模裸体表演在线观看| 日韩一级精品| 手机在线理论片| 日韩乱码一区二区| 精品久久一二三| 97久久久久久| 欧美日韩中文字幕在线视频| 在线亚洲伦理| 高清av一区| 波多野结衣激情视频| 无遮挡又爽又刺激的视频| 国产精欧美一区二区三区| 在线观看中文字幕不卡| 青青草97国产精品免费观看无弹窗版| 欧美aaa视频| 国产精品综合在线| 亚洲一级Av无码毛片久久精品| 成人在线免费观看一区| 日韩精品免费视频| 国产女主播一区| 欧美成熟视频| 少妇视频在线观看| 性色av一区二区三区四区| 免费不卡av网站| 日本一区二区三区视频免费看| 中文字幕久热精品在线视频| 一区二区三区在线播放| 先锋影音久久久| 精品伊人久久| 精品欧美不卡一区二区在线观看 | 99re8精品视频在线观看| 欧美手机在线观看| 午夜精品亚洲一区二区三区嫩草| 社区色欧美激情 | 午夜激情一区二区| 久久 天天综合| 亚欧洲精品视频在线观看| 黄色网在线看| 中文字幕日日夜夜| 精品人妻一区二区三区香蕉| 日韩一级性生活片| 3d蒂法精品啪啪一区二区免费| 一个色综合导航| 色综合久久久久综合99| 国产成人精品亚洲日本在线桃色| 欧美一区二区三区高清视频| 热色播在线视频| 日本在线丨区| 国产精品500部| 一级国产黄色片| 国产深夜男女无套内射| 激情视频在线观看一区二区三区| 欧美夫妻性生活xx| 日韩欧美一级二级三级| 亚洲一区在线播放| 成人av网站免费观看| 国精品一区二区三区| 视频一区日韩| 国产后进白嫩翘臀在线观看视频| 丰满人妻一区二区| 亚洲第一精品在线观看| 国产aⅴ激情无码久久久无码| 国产aaa一级片| 日韩欧美一区二区在线观看| 国产精品日韩专区| 久久综合国产精品台湾中文娱乐网 | 在线看片欧美| 视频一区中文| 经典三级久久| 国产精品粉嫩| 永久免费网站在线| 精品视频二区| 国产刺激高潮av| 亚洲色婷婷一区二区三区| 国产 porn| 成人精品视频在线播放| 久久66热这里只有精品| 91精品久久久久久久久久| 欧美高跟鞋交xxxxxhd| 亚洲人成在线观看| 欧美成va人片在线观看| 91精选在线观看| 欧美视频第一页| 亚洲精品国产一区二区三区四区在线| 2023国产精品| 成人动漫一区二区| 国产一区二区福利视频| 日韩电影一区二区三区| 国产精品久久久久毛片大屁完整版 | 成人在线高清视频| 男人天堂av网| 99视频在线观看免费| 中文字幕视频在线播放| 中文字字幕在线中文| 香蕉视频一区二区| 国产亚洲精品成人| 欧美爱爱小视频| 精品少妇久久久| 国产精品7777| 国产尤物在线视频| 精品不卡一区二区| 国产又大又黄视频| 亚洲国产成人无码av在线| 亚洲精品午夜久久久久久久| 日本三级网站在线观看| 精品处破女学生| 日本天堂在线视频| 播放灌醉水嫩大学生国内精品| 亚洲欧洲日韩精品| 亚洲综合欧美日韩| avove在线观看| av在线播放天堂| 黑人糟蹋人妻hd中文字幕 | 韩国av一区二区三区在线观看| 激情另类小说区图片区视频区| 日本aⅴ免费视频一区二区三区| 日本中文一区二区三区| 亚洲免费福利一区| 欧美gay视频| 台湾佬成人网| 韩国三级大全久久网站| 91在线一区| 欧美色就是色| 精品成人在线| 青青草国产精品亚洲专区无| 国产一区三区三区| 久久夜色精品国产欧美乱极品| 国产精品蜜臀在线观看| 亚洲成人av中文| 91精品婷婷国产综合久久竹菊| 亚洲国产成人一区| 久久精品国产亚洲精品2020| 91超碰中文字幕久久精品| 95av在线视频| 日韩欧美精品一区二区| 久久国产午夜精品理论片最新版本| 毛片一区二区三区四区| 在线精品视频播放| 国产67194| 亚洲一区二区色| 国产在线视频网址| 性孕妇free特大另类| 国产精品chinese在线观看| 国产精品久久久久久麻豆一区软件| 亚洲资源av| 本田岬高潮一区二区三区| 国产精品国产成人国产三级 | 精品黑人一区二区三区国语馆| av在线播放av| 九七电影院97理论片久久tvb| 亚洲+小说+欧美+激情+另类| 国产亚洲在线观看| 久久久亚洲综合| 无吗不卡中文字幕| 日韩av在线高清| 欧美最近摘花xxxx摘花| 欧美三级华人主播| 男女爽爽爽视频| 很污很黄的网站| 91高潮大合集爽到抽搐| 菠萝菠萝蜜在线视频免费观看| 台湾天天综合人成在线| 午夜性色一区二区三区免费视频| 国产一区二区三区久久久| 亚洲永久免费av| 欧美日韩精品在线观看| 欧美一级在线观看| 97精品一区二区视频在线观看| 久精品国产欧美| 免费涩涩18网站入口| 精品国产视频在线观看| 丰满少妇在线观看bd| 国产超碰精品| 国内自拍一区| 中文字幕av一区二区三区高| 欧美一区二区黄色| 热门国产精品亚洲第一区在线| 亚洲欧美日韩另类精品一区二区三区 | 国产拍精品一二三| 日韩 欧美 视频| 国产色无码精品视频国产| 青青免费在线视频| xxxxxhd亚洲人hd| 精品中文字幕一区二区小辣椒| 精品成人久久av| 欧美成人高清视频| 亚洲一区3d动漫同人无遮挡| 亚洲欧美色图视频| 免费av网站观看| 精品成人18| 激情六月婷婷久久| 欧美性一级生活| 国产成人精品在线| 丰满少妇被猛烈进入高清播放| 欧美精品久久久久久久久46p| 日韩大胆人体| 精品国产一级毛片| 91亚洲精品乱码久久久久久蜜桃| 欧美大胆一级视频| 91沈先生播放一区二区| 色黄视频免费看| 亚洲av永久无码国产精品久久 | 日本无删减在线| 欧美视频四区| 亚洲高清中文字幕| 国外视频精品毛片| 欧美亚洲一二三区| jizz国产在线观看| 成人综合网站| 国产米奇在线777精品观看| 制服丝袜激情欧洲亚洲| 成人妇女淫片aaaa视频| 人妻精油按摩bd高清中文字幕| 99免费在线视频| 黄色综合网址| 一区二区日本视频| 欧洲亚洲精品在线| 成人福利视频在线观看| 国产国语性生话播放| h视频在线免费| 欧美国产91| 91久久线看在观草草青青| 91日本在线观看| 欧美双性人妖o0| 伊人免费在线| 国产精品尤物| 日韩一级在线观看| 性欧美.com| 在线观看免费国产视频| 97色婷婷成人综合在线观看| 99免费精品在线观看| 色婷婷av一区二区三区在线观看| japanese在线视频| 国产成人av免费| 婷婷精品在线| 亚洲成年人网站在线观看| 成人两性免费视频| 夫妇露脸对白88av| 色偷偷色偷偷色偷偷在线视频| 国产91综合网| 另类视频在线观看| 网站一区二区三区| 国产美女性感在线观看懂色av | 这里只有精品99re| 亚欧精品在线| 国产午夜无码视频在线观看| 青青视频一区二区| 狠狠干狠狠久久| 精品国产乱码久久久久久108| 男女免费视频网站| 91亚洲精品视频在线观看| 一区二区三区在线视频免费观看 | 五月天激情丁香| 成人免费91| 亚洲国产裸拍裸体视频在线观看乱了 | 欧美mv日韩mv国产网站| 丰满少妇大力进入| 天堂在线资源库| 亚洲欧美日韩精品一区二区| 精品国产凹凸成av人网站| 欧美精品自拍视频| 欧美女子与性| 黄页网站大全一区二区| 色综合久久久888| 一级特黄a大片免费| 欧美日韩女优| 一区二区三区精品在线| 麻豆精品视频| 成人公开免费视频| 亚洲涩涩av| 欧美在线观看视频一区二区| 中文字幕中文字幕99| 嫩草影院一区二区| 日韩成人av影视| 亚州av一区二区| 很污很黄的网站| 免费不卡中文字幕在线| 欧美一区二区啪啪| 黑鬼大战白妞高潮喷白浆| eeuss影院在线观看| 高清免费成人av| 国产精品永久免费观看| 国产在线视频在线观看| 91欧美在线| 亚洲日韩中文字幕| 性猛交╳xxx乱大交| 涩涩涩久久久成人精品| 欧美视频在线看| 欧美一级片免费播放| 最爽无遮挡行房视频在线| 亚洲国产高清不卡| 欧美不卡福利| 日本一本草久在线中文| 成人黄色在线视频| 国产在线一区二区三区欧美| 国产三级按摩推拿按摩| 久久99久久久欧美国产| 欧美亚洲在线观看| 五月天综合激情| 91精品二区| 高清在线视频日韩欧美| 天堂资源在线播放| 国产在线不卡| 97在线免费视频| 成人毛片18女人毛片| 国产亚洲毛片在线| 日本中文字幕不卡免费| 国产字幕在线观看| 蜜桃视频在线一区| 成人精品视频在线| 亚洲产国偷v产偷v自拍涩爱| 成人综合在线视频| 精品在线不卡| www.在线视频.com| 一区二区成人在线| 国产黄页在线观看| 日本在线视频一区二区| 欧美精品在线一区二区三区| 亚洲一二三av| 亚洲国产合集| 精品国内亚洲在观看18黄 | www.精品| 欧美一区二区三区的| 丰满少妇在线观看资源站| 色综合色综合| 97久久精品在线| 国产999久久久| 国产丝袜在线精品| 亚洲中文字幕无码一区二区三区| 1234区中文字幕在线观看|