Install
openclaw skills install @harrylabsj/dianping-restaurant-guideAnalyze Dianping reviews to detect fake feedback, extract genuine sentiment, and deliver personalized restaurant and dish recommendations with authenticity s...
openclaw skills install @harrylabsj/dianping-restaurant-guideMake smarter dining decisions by cutting through Dianping's noise. Detect fake reviews, extract genuine sentiment signals, and get personalized restaurant recommendations with dish-level ordering guides.
Input: User provides:
Output: Structured dining profile. Logic: Fill missing fields with sensible defaults (budget = ¥50-150, radius = 3km). Ask clarifying questions for ambiguous inputs.
Input: Dining profile. Action: Search Dianping for restaurants matching criteria. Filters:
Output: Candidate list (typically 10–30 restaurants). Logic: Deduplicate chain locations unless user prefers them. Track "hidden gems" (high real-review score despite moderate overall rating).
Input: Candidate restaurant list. Action: Scrape recent reviews (sample ≥30 per restaurant, prioritized by recency). Data extracted per review:
Output: Raw review corpus per restaurant. Logic: Respect Dianping rate limits. Cache for 1 hour.
Input: Review corpus per restaurant. Detection signals (multi-dimensional scoring):
| Signal | Red Flag Pattern | Weight |
|---|---|---|
| Time cluster | ≥5 reviews within 30 min | High |
| Reviewer age | Account <7 days old | High |
| Review frequency | >10 reviews/day across restaurants | Medium |
| Text similarity | High cosine similarity with other reviews | High |
| Photo EXIF | Identical camera/settings across "different" users | Medium |
| Generic language | "环境不错""味道很好" without specifics | Low |
| Rating pattern | All 5-star, no detail | Low |
| Reviewer history | Only 5-star reviews, never critical | Medium |
Output: Each review tagged: genuine | suspicious | likely_fake. Restaurant scored with authenticity index (0–100).
Logic: Ensemble scoring with weighted signals. Flag entire restaurant as "suspicious" if >40% reviews are likely_fake. This is the key differentiator from any existing tool.
Input: Filtered genuine reviews. Action: LLM-based sentiment extraction across 4 dimensions:
Output: Structured sentiment summary per restaurant.
=== 老王川菜 (Rating: 4.3, Authenticity: 92%) ===
👍 Taste: Mapo Tofu (must-order, 38 mentions), 回锅肉 (authentic, 25 mentions)
👎 Taste: 水煮鱼 (bland, 7 complaints)
👍 Environment: Cozy but cramped (expect wait at peak)
👎 Service: Slow during dinner rush (12 mentions)
💰 Value: ¥65/person, "great value" (22 mentions vs 3 "overpriced")
Input: Sentiment summaries + user dining profile. Scoring formula:
Score = w1 × cuisine_match + w2 × sentiment_score + w3 × value_score + w4 × occasion_fit + w5 × authenticity_bonus
Output: Ranked top 5–10 restaurants with:
Input: Top-ranked restaurant + dish sentiment data. Output: Ready-to-use ordering card:
=== 老王川菜 · 2人点菜指南 ===
预算: ¥120-150
必点 (Must Order):
☑ 麻婆豆腐 ¥28 — 38人推荐,招牌菜
☑ 回锅肉 ¥42 — 25人推荐,正宗
可点 (Recommended):
○ 蒜泥白肉 ¥32 — 18人推荐
避雷 (Skip):
✕ 水煮鱼 ¥88 — 7人评价"不入味",性价比低
💡 人均参考: ¥60-75
🕐 建议时间: 11:30前或13:30后避开高峰
Logic: Adjust portion recommendations based on party size. For group dinners, suggest "大份" or double-ordering popular dishes.
Input: Multiple restaurants worth visiting + starting location. Output: Geographically optimized route:
🍽️ 静安寺美食探店路线 (步行可达):
1. 老王川菜 (午餐, 11:30) → 步行3分钟
2. 弄堂小馄饨 (下午茶, 14:00) → 步行5分钟
3. 福1088 (晚餐, 18:00)
Logic: Group restaurants by proximity clusters. Factor in operating hours (some close between lunch and dinner).
User: "上海静安寺附近,想吃川菜,人均100左右,约会,推荐3家靠谱的" Expected Output: 3 ranked restaurants with authenticity scores, must-order dishes, date-suitability notes.
User: "这家网红店评分4.8但我觉得不好吃,帮我看看评价是不是刷的 —— [Dianping URL]" Expected Output: Fake review detection report: what % of reviews look fake, specific suspicious patterns found, genuine review sentiment summary.
User: "今晚去吃XX火锅,帮我看看哪些菜必点,哪些是雷" Expected Output: Detailed ordering guide with specific dish recommendations sourced from genuine reviews.
User: "XX餐厅评分3.8,有人狂推有人狂骂,到底是什么情况?" Expected Output: Analysis of both camps: "5-star reviewers love the authentic taste and value; 1-star reviewers complain about slow service and cramped space. Verdict: go for the food, not the ambiance."
User: "下周去成都出差3天,住春熙路附近,帮我规划一个探店路线,要正宗川菜和小吃" Expected Output: 3-day exploration route: lunch + dinner + snack recommendations, geographically clustered, with ordering guides.
User: "8个人聚餐,北京国贸附近,预算人均150-200,要有包间,适合聊天的" Expected Output: 5 restaurant options with private room availability notes, group-friendly dish combos, per-person budget breakdown.
Scenario: User planning a third date, wants to impress without being too formal. Input: "上海法租界附近,人均200-300,约会,氛围好但不要太正式,最好是西餐或日料" Steps:
Scenario: First time in Chengdu, wants authentic local food, not tourist traps. Input: "刚到成都,住宽窄巷子附近,想吃地道川菜和小吃,避开网红店,人均50-100" Steps:
Scenario: Hosting 6 clients, needs upscale private dining with guaranteed quality. Input: "北京朝阳区,商务宴请6人,人均400-600,要有包间,粤菜或淮扬菜,服务要专业" Steps:
| Condition | Behavior |
|---|---|
| <50 total reviews for a restaurant | Flag as "insufficient data"; still show but with low-confidence warning |
| All reviews flagged as suspicious | Mark restaurant "⚠️ High fake review risk"; still show genuine sentiment if any |
| User location outside Dianping coverage | Inform; Dianping covers mainland China primarily |
| Cuisine type has <3 candidates | Expand radius or suggest adjacent cuisines |
| Budget too low for area (<¥30/person) | Suggest street food / food court alternatives |
| Restaurant chain with >10 locations | De-duplicate; show 2-3 closest locations |
| Dianping blocks scraping | Fall back to cached data; show staleness timestamp |
| Party size >12 | Suggest banquet/private dining only; filter out small-table venues |
| Occasion = "proposal" or "anniversary" | Add extra weight to environment + service; flag "special occasion" friendly venues |
| Error Code | Scenario | Handling |
|---|---|---|
| E-SCRAPE-BLOCKED | Dianping anti-scraping triggers | Use cached data, flag staleness, retry after cooldown |
| E-INSUFFICIENT-REVIEWS | Restaurant has <30 reviews | Show with "low confidence" badge; limit recommendations |
| E-LOCATION-UNKNOWN | Location string can't be resolved | Ask user for district or landmark clarification |
| E-NO-CANDIDATES | Zero restaurants match criteria | Relax filters iteratively: expand radius → budget → cuisine |
| E-FAKE-OVERWHELM | >60% reviews detected as fake | Strong warning; recommend skipping this restaurant |
| E-PHOTO-PARSE-FAIL | Can't extract photo metadata | Degrade gracefully; skip photo-based fake detection signals |
| File | Purpose |
|---|---|
SKILL.md | Full design document (this file) |
skill.json | Skill metadata with script/schema references |
scripts/dianping-guide.py | Main Python CLI — implements all workflow steps |
schemas/input.schema.json | JSON Schema for dining profile and restaurant data |
schemas/output.schema.json | JSON Schema for all output types (authenticity/sentiment/ranking/ordering/route) |
references/signals.json | Fake review detection signal definitions, weights, and thresholds |
# Step 1: Define dining context
./scripts/dianping-guide.py profile --location "上海静安寺" --cuisine 川菜 --budget-max 100
# Step 2: Discover candidates (uses built-in sample data)
./scripts/dianping-guide.py discover --cuisine 川菜 --budget-max 100
# Step 3+4+5: Analyze a restaurant (fake detection + sentiment)
./scripts/dianping-guide.py analyze "老王川菜"
# Step 6: Personalized ranking
./scripts/dianping-guide.py rank --cuisine 川菜 --occasion date
# Step 7: Ordering guide
./scripts/dianping-guide.py order "老王川菜" --party-size 2
# Step 8: Exploration route
./scripts/dianping-guide.py route --start "静安寺"
0.25×cuisine_match + 0.20×value + 0.20×occasion + 0.30×authenticity_bonus.references/signals.json loaded at runtime for detection thresholdsAll analysis uses built-in sample restaurant data. For production use, replace SAMPLE_RESTAURANTS with scraped Dianping data (respecting rate limits and robots.txt).