好友
阅读权限10
听众
最后登录1970-1-1
|
想了好久还是发下吧,有很多人找我做个抖音场控,自己做完了,然后朋友拿出去代{过}{滤}理卖了,现在分享下思路。
因为是个java程序员,所以拿得java开发的。
目前场控有几种思路:
1、是PC端调用js,获取粉丝发言和礼物信息等。然后模拟用户发言。
2、是PC端直接以流的形式进行解密读取然后直接把要发言的内容加密发送。
3、是移动端autojs,没研究。
4、是移动端hook,直接调用方法,研究了,没找到具体类和方法名。(如有朋友找到了,方便的话提供给我,我继续研究,感谢)
正文:本人采用的是第一种方法,原因很简单,就是简单。
思路,首先用java创建了一个Application,然后用swing画了个样式。如下图,有些场控的设置。
界面很丑,但是功能实现了。swing部分代码如下,不是不分享,是代码太多了,展示部分代码。
[Asm] 纯文本查看 复制代码 class FrameInOut extends JFrame implements ActionListener
{
JButton btn1,btn2,btn3;
static JTextArea ta1,ta2;
JTextField jtf_urlts,jtf_url,jtf2,jtf08;
JPanel p1,p2,p3;
ImageIcon background;
JPanel imagePanel;
JComboBox comboBox01,comboBox02,comboBox03,comboBox04,comboBox05,comboBox07,comboBox08,comboBox09,comboBox11,comboBox12,comboBox13,comboBox14,comboBox15,comboBox16;
boolean dk = false;
FrameInOut()
{
super(Tools.title);
background = new ImageIcon("image/background.jpeg");//背景图片
JLabel label = new JLabel(background);//把背景图片显示在一个标签里面
label.setBounds(0,0,background.getIconWidth(),background.getIconHeight());
//把内容窗格转化为JPanel,否则不能用方法setOpaque()来使内容窗格透明
imagePanel = (JPanel)this.getContentPane();
imagePanel.setOpaque(false);
imagePanel.setLayout(new FlowLayout());
this.getLayeredPane().setLayout(null);
//把背景图片添加到分层窗格的最底层作为背景
this.getLayeredPane().add(label,new Integer(Integer.MIN_VALUE));
this.setFont(new Font("隶体",Font.BOLD,100));
this.setBackground(Color.blue);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
/*初始化各个按钮*/
JLabel jl1 = new JLabel("填写使用编号后点击登录");
jl1.setHorizontalAlignment(SwingConstants.RIGHT);
jtf_urlts = new JTextField();
jtf_urlts.setText("填写使用编号后点击登录");
jtf_urlts.setEditable(false);
jtf_urlts.setFont(new Font("隶体",Font.BOLD,20));
jtf_url = new JTextField(20);
jtf_url.setText("");
Map infoMap = InfoTools.getInfo();
if (infoMap.containsKey("zbj")) {
String zbj = (String) infoMap.get("zbj");
if (zbj.trim().length() > 0) {
jtf_url.setText(zbj.trim());
}
}
jtf_url.setFont(new Font("隶体",Font.BOLD,20));
btn1=new JButton("应用");
btn2=new JButton("打开直播间");
btn3=new JButton("登录");
btn1.setEnabled(false);
btn2.setEnabled(false);
/*初始化文本域*/
/*初始化文本域的大小,行列数*/
ta1=new JTextArea(17,40);
ta2=new JTextArea(17,40);
/*初始化面板,将个空间加入容器*/
p1=new JPanel();
p2=new JPanel(new GridLayout(7, 4,20,10));//4行4列 水平间距20 垂直间距10
p3=new JPanel();
p1.add(jl1);
p1.add(jtf_url);
p1.add(btn3);
p1.add(btn1);
p1.add(btn2);
//文字感谢总控
JLabel jl01 = new JLabel("文字感谢总控:");
jl01.setFont(new Font("隶体",Font.BOLD,20));
jl01.setHorizontalAlignment(SwingConstants.RIGHT);
comboBox01=new JComboBox();//创建一个新的下拉框对象
comboBox01.addItem("开");//给下拉框对象添加条目元素
comboBox01.addItem("关");
comboBox01.setFont(new Font("隶体",Font.BOLD,20));
p2.add(jl01);
p2.add(comboBox01);
//语音感谢总控
JLabel jl09 = new JLabel("语音感谢总控:");
jl09.setFont(new Font("隶体",Font.BOLD,20));
jl09.setHorizontalAlignment(SwingConstants.RIGHT);
comboBox09=new JComboBox();//创建一个新的下拉框对象
comboBox09.addItem("开");//给下拉框对象添加条目元素
comboBox09.addItem("关");
comboBox09.setFont(new Font("隶体",Font.BOLD,20));
p2.add(jl09);
p2.add(comboBox09);
//升级感谢开关
JLabel jl03 = new JLabel("升级感谢开关:");
jl03.setFont(new Font("隶体",Font.BOLD,20));
jl03.setHorizontalAlignment(SwingConstants.RIGHT);
comboBox03=new JComboBox();//创建一个新的下拉框对象
comboBox03.addItem("开");//给下拉框对象添加条目元素
comboBox03.addItem("关");
comboBox03.setFont(new Font("隶体",Font.BOLD,20));
p2.add(jl03);
p2.add(comboBox03);
//礼物感谢开关
JLabel jl04 = new JLabel("礼物感谢开关:");
jl04.setFont(new Font("隶体",Font.BOLD,20));
jl04.setHorizontalAlignment(SwingConstants.RIGHT);
comboBox04=new JComboBox();//创建一个新的下拉框对象
comboBox04.addItem("开");//给下拉框对象添加条目元素
comboBox04.addItem("关");
comboBox04.setFont(new Font("隶体",Font.BOLD,20));
p2.add(jl04);
p2.add(comboBox04);
//欢迎感谢开关
JLabel jl05 = new JLabel("欢迎感谢开关:");
jl05.setFont(new Font("隶体",Font.BOLD,20));
jl05.setHorizontalAlignment(SwingConstants.RIGHT);
comboBox05=new JComboBox();//创建一个新的下拉框对象
comboBox05.addItem("开");//给下拉框对象添加条目元素
comboBox05.addItem("关");
comboBox05.setFont(new Font("隶体",Font.BOLD,20));
p2.add(jl05);
p2.add(comboBox05);
//文字发言延时
JLabel jl02 = new JLabel("文字发言延时:");
jl02.setFont(new Font("隶体",Font.BOLD,20));
jl02.setHorizontalAlignment(SwingConstants.RIGHT);
comboBox02=new JComboBox();//创建一个新的下拉框对象
comboBox02.addItem("2秒");
comboBox02.addItem("3秒");
comboBox02.addItem("4秒");
comboBox02.addItem("5秒");
comboBox02.addItem("6秒");
comboBox02.addItem("7秒");
comboBox02.addItem("8秒");
comboBox02.addItem("9秒");
comboBox02.setSelectedItem("4秒");
comboBox02.setFont(new Font("隶体",Font.BOLD,20));
p2.add(jl02);
p2.add(comboBox02);
//定时发言开关
//JLabel jl06 = new JLabel("定时发言开关:");
//jl06.setFont(new Font("隶体",Font.BOLD,20));
//jl06.setHorizontalAlignment(SwingConstants.RIGHT);
//comboBox06=new JComboBox();//创建一个新的下拉框对象
//comboBox06.addItem("开");//给下拉框对象添加条目元素
//comboBox06.addItem("关");
//comboBox06.setFont(new Font("隶体",Font.BOLD,20));
// p2.add(jl06);
//p2.add(comboBox06);
//定时发言延时
JLabel jl07 = new JLabel("定时发言延时:");
jl07.setFont(new Font("隶体",Font.BOLD,20));
jl07.setHorizontalAlignment(SwingConstants.RIGHT);
comboBox07=new JComboBox();//创建一个新的下拉框对象
comboBox07.addItem("30秒");//给下拉框对象添加条目元素
comboBox07.addItem("60秒");
comboBox07.addItem("120秒");
comboBox07.addItem("180秒");
comboBox07.addItem("240秒");
comboBox07.addItem("300秒");
comboBox07.setSelectedItem("60秒");
comboBox07.setFont(new Font("隶体",Font.BOLD,20));
p2.add(jl07);
p2.add(comboBox07);
//定时发言内容
JLabel jl08 = new JLabel("幸运惊喜开关:");
jl08.setFont(new Font("隶体",Font.BOLD,20));
jl08.setHorizontalAlignment(SwingConstants.RIGHT);
comboBox08 = new JComboBox();//创建一个新的下拉框对象
comboBox08.addItem("关");
comboBox08.addItem("开");//给下拉框对象添加条目元素
comboBox08.setFont(new Font("隶体",Font.BOLD,20));
p2.add(jl08);
p2.add(comboBox08);
//语音后缀开关
//JLabel jl10 = new JLabel("语音后缀开关:");
//jl10.setFont(new Font("隶体",Font.BOLD,20));
//jl10.setHorizontalAlignment(SwingConstants.RIGHT);
//comboBox10=new JComboBox();//创建一个新的下拉框对象
//comboBox10.addItem("开");//给下拉框对象添加条目元素
//comboBox10.addItem("关");
//comboBox10.setFont(new Font("隶体",Font.BOLD,20));
//p2.add(jl10);
//p2.add(comboBox10);
//语音礼物开关
JLabel jl11 = new JLabel("语音礼物开关:");
jl11.setFont(new Font("隶体",Font.BOLD,20));
jl11.setHorizontalAlignment(SwingConstants.RIGHT);
comboBox11=new JComboBox();//创建一个新的下拉框对象
comboBox11.addItem("开");//给下拉框对象添加条目元素
comboBox11.addItem("关");
comboBox11.setFont(new Font("隶体",Font.BOLD,20));
p2.add(jl11);
p2.add(comboBox11);
//发音人物选择
JLabel jl12 = new JLabel("发音人物选择:");
jl12.setFont(new Font("隶体",Font.BOLD,20));
jl12.setHorizontalAlignment(SwingConstants.RIGHT);
comboBox12=new JComboBox();//创建一个新的下拉框对象
comboBox12.addItem("小燕(离线女生)");//给下拉框对象添加条目元素
comboBox12.addItem("小峰(离线男生)");
comboBox12.setFont(new Font("隶体",Font.BOLD,20));
p2.add(jl12);
p2.add(comboBox12);
//语音延时
JLabel jl13 = new JLabel("语音发言延时:");
jl13.setFont(new Font("隶体",Font.BOLD,20));
jl13.setHorizontalAlignment(SwingConstants.RIGHT);
comboBox13=new JComboBox();//创建一个新的下拉框对象
comboBox13.addItem("4秒");//给下拉框对象添加条目元素
comboBox13.addItem("6秒");
comboBox13.addItem("8秒");
comboBox13.addItem("10秒");
comboBox13.addItem("12秒");
comboBox13.addItem("14秒");
comboBox13.addItem("16秒");
comboBox13.setSelectedItem("10秒");
comboBox13.setFont(new Font("隶体",Font.BOLD,20));
p2.add(jl13);
p2.add(comboBox13);
//发音语速
JLabel jl14 = new JLabel("语音发音语速:");
jl14.setFont(new Font("隶体",Font.BOLD,20));
jl14.setHorizontalAlignment(SwingConstants.RIGHT);
comboBox14=new JComboBox();//创建一个新的下拉框对象
comboBox14.addItem("10");//给下拉框对象添加条目元素
comboBox14.addItem("20");
comboBox14.addItem("30");
comboBox14.addItem("40");
comboBox14.addItem("50");
comboBox14.addItem("60");
comboBox14.addItem("70");
comboBox14.addItem("80");
comboBox14.addItem("90");
comboBox14.addItem("100");
comboBox14.setSelectedItem("50");
comboBox14.setFont(new Font("隶体",Font.BOLD,20));
p2.add(jl14);
p2.add(comboBox14);
//发音语调
JLabel jl15 = new JLabel("语音发音语调:");
jl15.setFont(new Font("隶体",Font.BOLD,20));
jl15.setHorizontalAlignment(SwingConstants.RIGHT);
comboBox15=new JComboBox();//创建一个新的下拉框对象
comboBox15.addItem("10");//给下拉框对象添加条目元素
comboBox15.addItem("20");
comboBox15.addItem("30");
comboBox15.addItem("40");
comboBox15.addItem("50");
comboBox15.addItem("60");
comboBox15.addItem("70");
comboBox15.addItem("80");
comboBox15.addItem("90");
comboBox15.addItem("100");
comboBox15.setSelectedItem("50");
comboBox15.setFont(new Font("隶体",Font.BOLD,20));
p2.add(jl15);
p2.add(comboBox15);
//发音音量
JLabel jl16 = new JLabel("语音发音音量:");
jl16.setFont(new Font("隶体",Font.BOLD,20));
jl16.setHorizontalAlignment(SwingConstants.RIGHT);
comboBox16=new JComboBox();//创建一个新的下拉框对象
comboBox16.addItem("10");//给下拉框对象添加条目元素
comboBox16.addItem("20");
comboBox16.addItem("30");
comboBox16.addItem("40");
comboBox16.addItem("50");
comboBox16.addItem("60");
comboBox16.addItem("70");
comboBox16.addItem("80");
comboBox16.addItem("90");
comboBox16.addItem("100");
comboBox16.setSelectedItem("50");
comboBox16.setFont(new Font("隶体",Font.BOLD,20));
p2.add(jl16);
p2.add(comboBox16);
p3.add(ta1);
p3.add(ta2);
add(p1);
add(p2);
add(p3);
setLayout(new FlowLayout());//流式布局
/*设置面板背景色*/
p1.setBackground(Color.LIGHT_GRAY);
/*各个按钮注册事件监听器*/
btn1.addActionListener(this);
btn2.addActionListener(this);
btn3.addActionListener(this);
setSize(1024,768);//设置界面尺寸
setVisible(true);
}
然后因为朋友想做成商业版的,所以很多设置在服务端,展示下服务端功能。
因为是管理员截图所以功能比普通用户多些。
然后最初的想法是调用个浏览器,然后控制,发现行不通,然后开始内建个浏览器,采用的是jxbrowser,然后用了两个版本,之前用的是6.24.3,现在主要用7.19,这个自行在网上所搜吧。
然后就是用浏览器打开直播地址。
[Asm] 纯文本查看 复制代码 JFrame frame = new JFrame(Tools.title);
//RenderingMode ss = com.teamdev.jxbrowser.engine.RenderingMode.HARDWARE_ACCELERATED;
// 谷歌内核浏览器
//Engine engine = Engine.newInstance(
// EngineOptions.newBuilder(ss).build());
JInternalFrame jf = new JInternalFrame();
Tools.browser = Browser.internalBrowser(frame,jf,Tools.url);
BrowserView view = BrowserView.newInstance(Tools.browser);
//禁用close功能
// frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//隐藏任务栏图标
// frame.setType(JFrame.Type.UTILITY);
// //不显示标题栏,最大化,最小化,退出按钮
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(view, BorderLayout.CENTER);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
然后用户登陆后,通过js监听直播间内的粉丝发言和礼物,找到class标签是"webcast-chatroom___item";
[Asm] 纯文本查看 复制代码 divs = Tools.getElementsByClassName(Tools.browser, Tools.ltkbs);
public static List<Element> t5 = null;
public static List<Element> getElementsByClassName(Browser browser,String className)
{
browser.mainFrame().flatMap(Frame::document).ifPresent(document -> {
t5 = document.findElementsByClassName(className);
});
return t5;
}
然后就是发言环节。直接代码。
[Asm] 纯文本查看 复制代码 String js = "document.querySelector('textarea').focus();document.execCommand('selectAll', false, null);document.execCommand('insertText', false, '" + fynr + "');";
Tools.executeJavaScript(Tools.browser, js);
//Tools.browser.executeJavaScript(js);
String js_oc = "document.getElementsByClassName('" + Tools.fskbs + "')[0].click();";
Tools.executeJavaScript(Tools.browser, js_oc);
排版实在没时间,如果有兴趣的可以一起研究。 |
免费评分
-
查看全部评分
|