环境与工具:win10 + IDEA

语言与框架:Java+JavaFX+Maven


功能描述

根据视频ID抽取该视频下的评论人员信息,统计总人数。评论页数对应的就是实际总评论分页。展示的就是幸运观众信息。程序很简单~


一. 效果

二. 代码

#项目结构

1. Maven 的 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>JAVAMid</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.54</version></dependency><dependency><groupId>com.jfoenix</groupId><artifactId>jfoenix</artifactId><version>8.0.4</version></dependency><dependency><groupId>io.datafx</groupId><artifactId>datafx</artifactId><version>8.0.1</version></dependency><dependency><groupId>io.datafx</groupId><artifactId>flow</artifactId><version>8.0.1</version></dependency><dependency><groupId>de.jensd</groupId><artifactId>fontawesomefx</artifactId><version>8.9</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>8</source><target>8</target></configuration></plugin></plugins></build>
</project>

2. UrlMip.java

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;
/*** @author lu123*/
public class UrlMip extends Application {@Overridepublic void start(Stage primaryStage) throws Exception {Parent root = FXMLLoader.load(getClass().getResource("/fxml/UrlMip.fxml"));primaryStage.setTitle("小破站视频评论抽奖");Scene scene = new Scene(root, 900, 465);primaryStage.setScene(scene);primaryStage.getIcons().add(new Image("/img/icon1.jpg"));primaryStage.show();}public static void main(String[] args) {launch(args);}
}

3. MyController.java

package org.urltest.luyuno_o;
import com.alibaba.fastjson.JSONObject;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.chart.PieChart;
import javafx.scene.control.*;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @author lu123*/
public class MyController {@FXMLLabel myLabel;@FXMLprivate TextField myID;@FXMLprivate ImageView myFigure;@FXMLprivate PieChart pieChart;@FXMLListView<String> listView;@FXMLprivate TextField pageNum;@FXMLprivate  TextField avID;@FXMLprivate ListView<String> ffans;@FXMLprivate Hyperlink avLink;private static String pgNum="";private static String avNum="";private static Set<String> set = new HashSet<String>();private static Map<String, Integer> map1 = new HashMap<String, Integer>();private static  String[] keys = map1.keySet().toArray(new String[0]);private String fans;private String name;private String title;private String sign;private String attention;private String imgUrl;private Map<Integer,String> map;{map = new HashMap<>();map.put(10,"十人突破");map.put(100,"百人进阶");map.put(1000,"千人进度");map.put(10000,"万人UP");map.put(100000,"十万粉丝");map.put(1000000,"百万大佬");map.put(10000000,"千万成就");map.put(100000000,"额~");}@FXMLpublic void onButton(ActionEvent event){String url1 = "https://api.bilibili.com/x/web-interface/card?mid="+myID.getText()+"&jsonp=jsonp&article=true";String json = loadJson(url1);System.out.println(json);JSONObject jsonObject = JSONObject.parseObject(json);String dataS = jsonObject.getString("data");JSONObject jsonObject2 = JSONObject.parseObject(dataS);String cardS = jsonObject2.getString("card");JSONObject jsonObject3 = JSONObject.parseObject(cardS);name = jsonObject3.getString("name");sign = jsonObject3.getString("sign");imgUrl = jsonObject3.getString("face");title = JSONObject.parseObject(jsonObject3.getString("Official")).getString("title");fans = jsonObject3.getString("fans");attention = jsonObject3.getString("attention");//System.out.println("m名字: "+name+" 签名:"+sign+ " 关注了: "+attention+" 粉丝数: "+fans);//图片Image image = new Image(imgUrl);myFigure.setImage(image);//myID.setText(name);//饼图pieChart.setData(getChartData());//ListViewMap<Integer,String> map = new HashMap<>();listView.setItems(getViewList());}//列表Listprivate ObservableList<String> getViewList(){ObservableList<String> items =FXCollections.observableArrayList();items.add("名  字:"+name);items.add("标  签:"+title);items.add("关  注:"+attention);items.add("粉丝数:"+fans);items.add("签  名:"+sign);return items;}//参加活动粉丝列表ffansprivate ObservableList<String> setFansParty(Set<String> set){ObservableList<String> items =FXCollections.observableArrayList();int cc=0;items.add("活动人数: "+set.size());for(String ss:set){cc++;items.add(Integer.toString(cc)+": "+ss);}return items;}//饼图Listprivate ObservableList<PieChart.Data> getChartData() {ObservableList<PieChart.Data> answer = FXCollections.observableArrayList();long fansNum = Integer.parseInt(fans);long k = fansNum/10;int n = 10;while(k>0){n = n*10;k=k/10;}if(n<100000000){answer.addAll(new PieChart.Data("已有粉丝", fansNum),new PieChart.Data(map.get(n), n-fansNum));}else{answer.addAll(new PieChart.Data("已有粉丝", fansNum),new PieChart.Data("大佬我们做朋友吧~", 0));}return answer;}//加载json数据public String loadJson (String url) {StringBuilder json = new StringBuilder();try {URL urlObject = new URL(url);URLConnection uc = urlObject.openConnection();BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));String inputLine = null;while ( (inputLine = in.readLine()) != null) {json.append(inputLine);}in.close();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return json.toString();}//爬取信息@FXMLpublic void getComments(ActionEvent event){if((!pgNum.equals(pageNum.getText())) || (!avNum.equals(avID.getText()))) {map1 = new HashMap<String, Integer>();set = new HashSet<>();avLink.setAccessibleText("https://www.bilibili.com/video/av" + avID.getText());avLink.setText("https://www.bilibili.com/video/av" + avID.getText());int pageC = Integer.parseInt(pageNum.getText());for (int page = 1; page <= pageC; page++) {String url = "https://api.bilibili.com/x/v2/reply?jsonp=jsonp&pn=" + page +"&type=1&oid=" + avID.getText() + "&sort=0";String json = loadJson(url);String reg = "\"mid\":\"[0-9]+\"";String regname = "\"uname\":\"((?!\").)*\"";//编译正则表达式Pattern pattern = Pattern.compile(reg);Pattern patternname = Pattern.compile(regname);Matcher matcher = pattern.matcher(json);Matcher matchername = patternname.matcher(json);while (matchername.find()) {String[] aa = matchername.group().split("\"");set.add(aa[3]);}while (matcher.find()) {String[] aa = matcher.group().split("\"");map1.put(aa[3], 1);}}keys = map1.keySet().toArray(new String[0]);}System.out.println(pgNum+" "+avNum);pgNum = pageNum.getText();avNum = avID.getText();System.out.println(pgNum+" "+avNum);//中奖号码fansNoString fansNo="";Random random = new Random();fansNo = keys[random.nextInt(keys.length)];myID.setText(fansNo);onButton(event);ffans.setItems(setFansParty(set));}//连接到外浏览器@FXMLprivate void onHyperlink(ActionEvent event) throws URISyntaxException, IOException {Desktop.getDesktop().browse(new URI(avLink.getText()));}
}

4. UrlMip.fxml

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.chart.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?><Pane prefHeight="469.0" prefWidth="892.0" xmlns="http://javafx.com/javafx/8.0.212" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.urltest.luyuno_o.MyController"><Label fx:id="mylabel" layoutX="14.0" layoutY="9.0" prefHeight="32.0" prefWidth="65.0" text=" UID :" textOverrun="CLIP"/><TextField fx:id="myID" layoutX="81.0" layoutY="10.0" onAction="#onButton" prefHeight="30.0" prefWidth="266.0" text="321173469" /><ImageView fx:id="myFigure" fitHeight="156.0" fitWidth="183.0" layoutX="14.0" layoutY="70.0" pickOnBounds="true" preserveRatio="true" /><PieChart fx:id="pieChart" layoutX="14.0" layoutY="233.0" legendSide="BOTTOM" prefHeight="219.0" prefWidth="312.0" /><ListView fx:id="listView" layoutX="204.0" layoutY="72.0" opacity="0.8" prefHeight="152.0" prefWidth="472.0" /><Label layoutX="407.0" layoutY="274.0" prefHeight="32.0" prefWidth="95.0" text="评论页数" textOverrun="CLIP"/><TextField fx:id="pageNum" layoutX="506.0" layoutY="275.0" onAction="#onButton" prefHeight="30.0" prefWidth="164.0" text="1" /><Label layoutX="424.0" layoutY="328.0" prefHeight="32.0" prefWidth="78.0" text="视频ID" textOverrun="CLIP"></Label><TextField fx:id="avID" layoutX="506.0" layoutY="329.0" onAction="#onButton" prefHeight="30.0" prefWidth="164.0" text="15928671" /><Button fx:id="choujiang" layoutX="575.0" layoutY="381.0" mnemonicParsing="false" onAction="#getComments" prefHeight="30.0" prefWidth="95.0" text="抽奖" /><ListView fx:id="ffans" layoutX="683.0" layoutY="72.0" prefHeight="363.0" prefWidth="193.0" /><Hyperlink fx:id="avLink" onAction="#onHyperlink" layoutX="318.0" layoutY="435.0" prefHeight="28.0" prefWidth="352.0" >https://www.bilibili.com</Hyperlink>
</Pane>

一个简单的B站视频抽奖小程序相关推荐

  1. 数字信号 fft c源码_如何制作一个简单的人体动态识别微信小程序(附源码)

    知乎小白第一次写专栏,还请多指教. 先放成果. GitHub源码: lrioxh/HAR-applet-of-Wechat​github.com b站演示视频: 居然不需要服务器?!如何制作一个简单的 ...

  2. bat 删除文件_利用电脑文本文档建立一个简单方便的删除文件的小程序

    删除文不需要的文件或者资料,是日常工作中必定会遇到了. 各种的杀毒软件或者防护软件都具备删除文件的功能,例如360.腾讯电脑管家.这些操作起来其实也不是太麻烦! 不过呢!今天来和大家分享一个更简单的方 ...

  3. python刷微博转发_一个简单的python刷新浪微博粉丝小程序

    代码简陋没有什么技术,还有个txt的配置文件才可以用.但是配置文件不发出来了.只要你自己好好看代码很容易猜得到.希望大家不要拿去刷了.因为实在是没意思. 代码中需要用到的相关python模块方法有: ...

  4. PerfDog 测试腾讯视频、优酷、爱奇艺视频类小程序性能

    自从经朋友介绍PerfDog这款移动端测试神器后就一直在使用它测试大型游戏的流程度,前两天使用腾讯视频追剧分享到微信时发现发现的链接直接进入腾讯视频的小程序中,试了多个视频软件皆是如此,于是想要试试用 ...

  5. 编写一个随机抽奖程序php,基于PHP实现简单的随机抽奖小程序

    摘要:一个抽奖小程序,概论可控,也可某个奖品在前端显示,而程序中根本不可能获得!把所有的概率x10后相加起来,新数组中每项的值等于它前几个的和加上它本身.然后随即生成一个0到最大数之间的一个数,通过循 ...

  6. 如何用excel制作xy曲线图_用Excel制作一个简易抽奖小程序,可一次抽取多人

    抽奖程序在很多场合都能派上用场,比如商场开业促销.课堂点名.抽取幸运观众等.我们今天就用Excel来制作一个简单的抽奖小程序,仅做参考. 抽奖小程序是下图这个样子的.我们按一下键盘上的F9键,即可完成 ...

  7. python 抽奖库_用 python 写一个年会抽奖小程序

    使用 pyinstaller 打包工具常用参数指南 pyinstaller -F demo.py 参数 含义 -F 指定打包后只生成一个exe格式的文件 -D –onedir 创建一个目录,包含exe ...

  8. 用php制作中奖系统,基于PHP随机抽奖小程序,很简单!

    原标题:基于PHP随机抽奖小程序,很简单! 文章来自于:博客 网址:https://blog.csdn.net/shaolong1013/article/details/78763057 一个抽奖小程 ...

  9. python 活动随机抽奖小程序 简单直白

    开始学习python相关知识,看最近有不少随机抽奖小程序,自己也做一个试试 思路: 建立一个抽奖人名单,可以打乱后直接按顺序取,也可以不打乱随机抽. 建立一个奖项名单,按顺序一个一个抽 将随机化成顺序 ...

最新文章

  1. DOS call 中的%cd%,当前文件夹演示
  2. 100c之50:到底谁在说谎
  3. 基于VMware vSphere 5.0的服务器虚拟化实践(8)
  4. python代码怎么运行-python代码如何运行
  5. Python基础知识4--数据结构(树)
  6. 【深度学习】90.94%准确率!谷歌刷新ImageNet新纪录!Model soups:提高模型的准确性和稳健性...
  7. implementation of UI5 bindAggregation - busyDialog is handled automatically
  8. leetcode 无重复字符的最长子串
  9. Matplotlib:plt.tight_layout()主标题(plt.suptitle)被覆盖
  10. 【sklearn第十三讲】Naive Bayes分类器
  11. 计算机书籍每周销量排行榜
  12. 2021-09-09
  13. php度分秒,度分秒计算方法-度分秒的计算方法!急
  14. 【模拟电路仿真】LM324加法器电路(激励源与正弦信号源的使用)
  15. PWM波控制舵机实验
  16. ios底部栏设计规范_设计干货:底部导航栏规范设计总结
  17. g华清远见基于linux和Qt,【华清远见】QT编程实例集
  18. Pytorch squeeze()的简单用法
  19. 万字好文!Redis 到底是怎么实现“附近的人”这个功能的呢?
  20. 2018年6月编程语言tiobe排行

热门文章

  1. 关键词搜图、截图小助手——有了它妈妈再也不用担心我数据集啦
  2. 阿里云对腾讯企业邮箱设置域名解析
  3. 通过Dockerfile创建docker镜像
  4. 内置函数sum与sum(list,[])
  5. DataFrame增加数据的多种方法
  6. Win7系统防火墙功能怎么彻底关闭教学
  7. PMP---项目经理解决冲突的8种模式,走过路过不要错过
  8. 基于手机信令数据研究交通出行特征具体实现
  9. 等保(公安部82号令)
  10. UnityShader图形学中的数学之Normal融合